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




mod-rewrite (6)

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]

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


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

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

मुझे एक mod_rewrite समाधान मिला जो दोनों प्रॉक्सी और असम्पीडित सर्वरों के लिए अच्छा काम करता है।

यदि आप क्लाउडफ्लारे, एडब्ल्यूएस लोचदार लोड संतुलन, हेरोकू, ओपनशफ्ट या किसी अन्य क्लाउड / पास समाधान का उपयोग कर रहे हैं और आप सामान्य HTTPS रीडायरेक्ट के साथ रीडायरेक्ट लूप का अनुभव कर रहे हैं, तो इसके बजाय निम्न स्निपेट आज़माएं।

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

मैं बस यह इंगित करना चाहता हूं कि निर्देशिका गहराई में एकाधिक .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
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

सरल एक:

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

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





https