.htaccess और mod_rewrite का उपयोग करके एसएसएल / https को बल दें [php]


Answers

PHP समाधान

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

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() और अन्य किसी भी कस्टम फ़ंक्शंस वाली एक केंद्रीकृत फ़ाइल की require() , और तब forceHTTPS() चलाएं forceHTTPS() फ़ंक्शन

HTACCESS / mod_rewrite समाधान

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

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

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




मैं सिर्फ यह कहना चाहूंगा कि अपाचे की सबसे ग़रीब विरासत नियम है जब डायरेक्ट्री गहराई में कई .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]



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

SSLOptions +StrictRequire
SSLRequireSSL

के लिए उपरोक्त उत्तर सही रीडायरेक्ट है