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




5 Answers

अपाचे के लिए, आप 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();
    }
}

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




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/



सरल एक:

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

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




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

  • 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]
    



Related

php .htaccess mod-rewrite ssl https