php - .htaccess और mod_rewrite का उपयोग कर SSL / https को मजबूर करें




mod-rewrite (9)

केवल Apache .htaccess के साथ SSL को मजबूर करने के लिए आप इसका उपयोग कर सकते हैं

SSLOptions +StrictRequire
SSLRequireSSL

उपरोक्त उत्तर को पुनर्निर्देशित करने के लिए सही है

PHP में विशिष्ट .htaccess और mod_rewrite पृष्ठ का उपयोग करके मैं SSL / https पर कैसे मजबूर कर सकता हूं।


सरल एक:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow

example.com के साथ अपने यूआरएल को प्रतिस्थापित करें


PHP समाधान

गॉर्डन के बहुत व्यापक उत्तर से सीधे उधार लेते हुए, मुझे लगता है कि आपका प्रश्न एचटीटीपीएस / एसएसएल कनेक्शन को मजबूर करने में पृष्ठ-विशिष्ट होने का उल्लेख करता है।

function forceHTTPS(){
  $httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  if( count( $_POST )>0 )
    die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
  if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
    if( !headers_sent() ){
      header( "Status: 301 Moved Permanently" );
      header( "Location: $httpsURL" );
      exit();
    }else{
      die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
    }
  }
}

फिर, इन पृष्ठों के शीर्ष के करीब जो आप PHP के माध्यम से कनेक्ट करने के लिए मजबूर करना चाहते हैं, आप require() किसी केंद्रीय फ़ाइल को (और किसी अन्य) कस्टम फ़ंक्शंस की आवश्यकता हो सकती है, और उसके बाद बस forceHTTPS() फ़ंक्शन चला सकते हैं।

HTACCESS / mod_rewrite समाधान

मैंने व्यक्तिगत रूप से इस तरह के समाधान को लागू नहीं किया है (मैंने PHP की सॉल्यूशंस का उपयोग करने के लिए ऊपर की तरह, जैसा कि इसकी सादगी के लिए उपयोग किया है), लेकिन कम से कम, एक अच्छी शुरुआत हो सकती है।

RewriteEngine on

# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$

# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

मैं बस यह इंगित करना चाहता हूं कि निर्देशिका गहराई में एकाधिक .htaccess फ़ाइलों का उपयोग करते समय अपाचे का सबसे खराब विरासत नियम है। दो महत्वपूर्ण नुकसान:

  • केवल गहरी। Htaccess फ़ाइल में निहित नियम डिफ़ॉल्ट रूप से निष्पादित किए जाएंगे। आपको इसे बदलने के लिए निर्देश (या समान) निर्देशों से पहले RewriteOptions InheritDownBefore निर्दिष्ट करना होगा। (प्रश्न देखें)
  • पैटर्न उपनिर्देशिका के सापेक्ष फ़ाइल पथ पर लागू होता है और निर्दिष्ट नियम के साथ .htaccess फ़ाइल वाली ऊपरी निर्देशिका नहीं है। (चर्चा देखें)

इसका मतलब यह है कि अगर आप उपनिर्देशिका में किसी अन्य .htaccess फ़ाइलों का उपयोग करते हैं तो अपाचे विकी पर सुझाए गए वैश्विक समाधान काम नहीं करते हैं। मैंने एक संशोधित संस्करण लिखा है जो करता है:

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/

इस कोड को आज़माएं, यह यूआरएल के सभी संस्करणों के लिए काम करेगा

  • website.com
  • www.website.com
  • http://website.com
  • http://www.website.com

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
    RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
    

मॉड-रीराइट आधारित समाधान:

Htaccess में निम्न कोड का उपयोग स्वचालित रूप से https के सभी http अनुरोधों को आगे बढ़ाएं।

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

यह आपके गैर-www और www http अनुरोधों को https के www संस्करण पर रीडायरेक्ट करेगा।

एक और समाधान (अपाचे 2.4 *)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

यह अपाचे के निचले संस्करणों पर काम नहीं करता है क्योंकि% {REQUEST_SCHEME} चर 2.4 के बाद से मॉड-रीराइट में जोड़ा गया था।


अपाचे के लिए, आप SSLRequireSSL Directive साथ SSL को मजबूर करने के लिए mod_ssl का उपयोग कर सकते हैं:

यह निर्देश तब तक पहुंच को रोकता है जब तक कि मौजूदा कनेक्शन के लिए एसएसएल (यानी HTTPS) पर HTTP सक्षम नहीं है। एसएसएल-सक्षम वर्चुअल होस्ट या कॉन्फ़िगरेशन त्रुटियों के खिलाफ बचाव के लिए यह बहुत आसान है जो संरक्षित होने वाली सामग्री का खुलासा करता है। जब यह निर्देश मौजूद होता है तो सभी अनुरोध अस्वीकार कर दिए जाते हैं जो SSL का उपयोग नहीं कर रहे हैं।

हालांकि यह https पर रीडायरेक्ट नहीं करेगा। रीडायरेक्ट करने के लिए, अपनी .htaccess फ़ाइल में mod_rewrite साथ निम्न का प्रयास करें

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

या दिए गए विभिन्न दृष्टिकोणों में से कोई भी

यदि आप अपने प्रदाता को अक्षम कर चुके हैं तो आप इसे PHP के भीतर से भी हल कर सकते हैं। Htaccess (जो कि आपने इसके लिए कहा है, लेकिन वैसे भी संभव नहीं है)

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    if(!headers_sent()) {
        header("Status: 301 Moved Permanently");
        header(sprintf(
            'Location: https://%s%s',
            $_SERVER['HTTP_HOST'],
            $_SERVER['REQUEST_URI']
        ));
        exit();
    }
}

यह कोड मेरे लिए काम करता है

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

समस्या यह है कि आपके पास आपके सिस्टम पर प्रमाणन प्राधिकरण प्रमाण पत्र स्थापित नहीं हैं। और इन certs cygwin के setup.exe के साथ स्थापित नहीं किया जा सकता है।

अद्यतन: साइगविन में नेट / सीए-प्रमाणपत्र पैकेज स्थापित करें (धन्यवाद dirkjot)

दो समाधान हैं:

  1. वास्तव में रूट प्रमाणपत्र स्थापित करें। मोज़िला से प्रमाण पत्र आपके लिए निकाले गए कर्ल लोग

    cacert.pem फ़ाइल वह है जिसे आप ढूंढ रहे हैं। इस फ़ाइल में> 250 सीए कर्ट हैं (पीपीएल की इस संख्या पर भरोसा कैसे करें) नहीं जानते हैं। आपको इस फ़ाइल को डाउनलोड करने की आवश्यकता है, इसे अलग-अलग प्रमाणपत्रों में विभाजित करने के लिए उन्हें / usr / ssl / certs (your capath) पर रखें और उन्हें अनुक्रमित करें।

    यहां है कि इसे कैसे करना है। Cygwin setup.exe कर्ल स्थापित करें और openssl संकुल निष्पादित करें:

    $ cd /usr/ssl/certs
    $ curl http://curl.haxx.se/ca/cacert.pem |
      awk '{print > "cert" (1+n) ".pem"} /-----END CERTIFICATE-----/ {n++}'
    $ c_rehash
    

    महत्वपूर्ण : c_rehash का उपयोग करने के लिए आपको openssl-perl भी इंस्टॉल करना होगा।

  2. एसएसएल प्रमाण पत्र सत्यापन को अनदेखा करें।

    चेतावनी: एसएसएल प्रमाण पत्र सत्यापन को अक्षम करने से सुरक्षा प्रभाव पड़ता है। एसएसएल / एचटीटीपीएस कनेक्शन की प्रामाणिकता के सत्यापन के बिना, एक दुर्भावनापूर्ण हमलावर एक विश्वसनीय एंडपॉइंट (जैसे गिटहब या कुछ अन्य रिमोट गिट होस्ट) का प्रतिरूपण कर सकता है, और आप मैन-इन-द-मिडल अटैक के प्रति संवेदनशील होंगे। समाधान के रूप में इसका उपयोग करने से पहले सुनिश्चित करें कि आप सुरक्षा समस्याओं और आपके खतरे के मॉडल को पूरी तरह से समझते हैं।

    $ env GIT_SSL_NO_VERIFY=true git clone https://github...
    






php .htaccess mod-rewrite ssl https