SSL / https को .htaccess और mod_rewrite का उपयोग कर


जवाबों:


438

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

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

हालांकि यह https पर पुनर्निर्देशित नहीं करेगा। रीडायरेक्ट करने के लिए, mod_rewriteअपनी .htaccess फ़ाइल में निम्नलिखित को आज़माएँ

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

या दिए गए विभिन्न तरीकों में से कोई भी

यदि आपका प्रदाता निष्क्रिय हो गया है, तो आप इसे पीएचपी के भीतर से भी हल कर सकते हैं।

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();
    }
}

1
यह हमारी स्थिति में बहुत अच्छा है क्योंकि हमारे पास वर्तमान में http और https ट्रैफ़िक का मिश्रण है। हमारे व्यवस्थापक क्षेत्र के लिए, हम बाकी साइट http को रखते हुए .htaccess स्क्रिप्ट में पॉप अप करते हैं।
माइकल जे। कैलकिंस

1
जब मैं mod_rewrite विधि का उपयोग करता हूं, तो मुझे https भेजा जाता है, लेकिन "पृष्ठ ठीक से पुनर्निर्देशित नहीं हो रहा है" त्रुटि के साथ।
Czechnology

11
फॉलोअप: यदि आपको समान परेशानी हो रही है, तो अपने सर्वर और HTTP वैरिएबल की जांच करें। यदि आपका सर्वर प्रॉक्सी का उपयोग करता है, तो आप एसएसएल चालू है %{HTTP:X-Forwarded-Proto}या %{HTTP:X-Real-Port}नहीं यह जांचने के लिए उपयोग या चर करना चाह सकते हैं ।
Czechnology

8
यदि आप प्रॉक्सी ( CloudFlare , Openshift ) के पीछे चलने वाले सर्वर पर पुनर्निर्देशित लूप का अनुभव करते हैं, तो इस उत्तर को उस समाधान के लिए देखें जो उस स्थिति के लिए भी काम करता है।
बलात्कार की सजा

4
@GTodorov - अंतरिक्ष को हटाकर मेरे लिए पुनर्लेखन को तोड़ दिया। पुनर्लेखन के मेरे (सीमित) ज्ञान से, वाक्य-विन्यास है RewriteRule <input-pattern> <output-url>। इस प्रकार, अंतरिक्ष को वहां रहने की जरूरत है, और एकल ^बस "सभी इनपुट URL से मेल खाता है" कहता है।
स्फिंक्सएक्स

54

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

यदि आप CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift या किसी अन्य Cloud / Paa समाधान का उपयोग कर रहे हैं और आप सामान्य 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]

यह शानदार thx है! लेकिन शायद पोस्ट की स्थिति को जोड़ने की आवश्यकता है? RewriteCond% {REQUEST_METHOD} ^ पोस्ट $!
Aleksej

@Aleksej सच है, यह असंबंधित POST अनुरोधों को तोड़ता है। लेकिन मुझे लगता है कि यह अच्छी बात है। इस तरह, लोग नोटिस करेंगे कि वे कुछ गलत कर रहे हैं। मुझे लगता है कि सबसे अच्छी बात उन्हें एक पृष्ठ पर पुनर्निर्देशित करना होगा जो उन्हें बताता है कि आपकी सेवा का सही उपयोग कैसे करें।
रफनेस

@raphinesse क्या आप इस प्रश्न का उत्तर जानते हैं: stackoverflow.com/questions/51951082/…
RRN

36

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

जिज्ञासा से बाहर, क्यों RewriteCond %{REQUEST_METHOD} !^POST$?
जुलाई

12
क्योंकि POST पैरामीटर को पुनर्निर्देशित नहीं किया जाता है। यदि आप यह सुनिश्चित करना चाहते हैं कि सभी POST सबमिशन सुरक्षित हैं (कोई भी असुरक्षित POST सबमिशन को नजरअंदाज कर दिया जाएगा) तो आप उस लाइन को छोड़ सकते हैं।
ल्यूक स्टीवेंसन

@Lucanos - एक ऐसा रिट्रीट कैसे लिखें जो POST के बाद http या https में रीडायरेक्ट न करे? मेरी .htaccess कुछ विशिष्ट पृष्ठों पर HTTPS को बाध्य करती है, और फिर HTTP को शेष पर मजबूर करती है। हालाँकि, HTTPS पृष्ठों पर, ऐसे प्रपत्र हैं जो मेरी वेब रूट पर सबमिट होते हैं। प्रपत्र HTTPS के रूप में कार्रवाई url को निर्दिष्ट करता है। हालाँकि, चूंकि वेब रूट उन पृष्ठों में से एक नहीं है जो HTTPS को बाध्य करने के लिए निर्दिष्ट किए गए हैं, मेरा .htaccess फिर एक रीडायरेक्ट को बल देता है - जिसका अर्थ है कि POST चर खो गए हैं। मैं POST पर पुनर्निर्देशन को कैसे रोकूँ?
स्टैकऑवरफ्लोवन्यू जुले

1
@StackOverflowNewbie: रेखा RewriteCond %{REQUEST_METHOD} !^POST$को POST सबमिशन को इन रीडायरेक्ट से प्रभावित होने से रोकना चाहिए।
ल्यूक स्टीवेंसन

मुझे यह PHP संस्करण पसंद है। यह बहुत बेहतर है क्योंकि यह एक POST समझता है और बेहतर है अगर हेडर पहले ही भेजे जा चुके हैं।
TheStoryCoder

10

मॉड-फिर से लिखना आधारित समाधान:

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

RewriteEngine on

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

यह आपके गैर- www और www http अनुरोधों को https के www संस्करण में पुनर्निर्देशित करेगा ।

एक अन्य समाधान (Apache 2.4 *)

RewriteEngine on

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

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


9

मैं सिर्फ यह बताना चाहूंगा कि अपाचे के पास सबसे बड़ी विरासत नियम हैं। दो प्रमुख नुकसान:

  • केवल .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/

0

सरल और आसान, बस निम्नलिखित जोड़ें

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

यह बहुत ज्यादा है जो पूरे इंटरनेट पर लोग आपको https के लिए मजबूर करने के लिए कह रहे हैं। हालाँकि, जब भी मैं ऐसा करता हूं, मेरी पूरी वेबसाइट FORBIDDEN हो जाती है या आपको देखने की कोई अनुमति नहीं है। ऐसा कुछ ... मैं गलत क्या कर रहा हूँ? मैं सिर्फ यह जानना चाहता हूं कि क्या इससे पहले कि आप इस पर कोई प्रश्न पोस्ट करें, आपको पता चल जाए।
13

मुझे भी इसी तरह की समस्या थी और मुझे https.conf फाइल में नियम लागू करने थे। नीचे मेरा जवाब देखें।
रिस्तेदार जूल

-1

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

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

-1

सरल एक:

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

example.com के साथ अपने url को बदलें


नहीं! साइट URL को गतिशील होना चाहिए।
अमीर सावर

-1

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

SSLOptions +StrictRequire
SSLRequireSSL

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.