जवाबों:
अपाचे के लिए, आप 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();
}
}
%{HTTP:X-Forwarded-Proto}
या %{HTTP:X-Real-Port}
नहीं यह जांचने के लिए उपयोग या चर करना चाह सकते हैं ।
RewriteRule <input-pattern> <output-url>
। इस प्रकार, अंतरिक्ष को वहां रहने की जरूरत है, और एकल ^
बस "सभी इनपुट URL से मेल खाता है" कहता है।
मुझे एक ऐसा 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]
गॉर्डन के बहुत व्यापक उत्तर से सीधे उधार लेते हुए, मैं ध्यान देता हूं कि आपके प्रश्न में 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()
फ़ंक्शन चला सकते हैं।
मैंने व्यक्तिगत रूप से इस तरह के समाधान को लागू नहीं किया है (मैंने ऊपर की तरह, सरलता के लिए 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$
?
RewriteCond %{REQUEST_METHOD} !^POST$
को POST सबमिशन को इन रीडायरेक्ट से प्रभावित होने से रोकना चाहिए।
मॉड-फिर से लिखना आधारित समाधान:
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 से मॉड-रीराइट करने के लिए जोड़ा गया था।
मैं सिर्फ यह बताना चाहूंगा कि अपाचे के पास सबसे बड़ी विरासत नियम हैं। दो प्रमुख नुकसान:
RewriteOptions InheritDownBefore
बदलने के लिए आपको निर्देश (या समान) निर्दिष्ट करना होगा । (प्रश्न देखें)इस का मतलब है पर वैश्विक समाधान का सुझाव दिया अपाचे विकी है नहीं करता है, तो आप उपनिर्देशिकाएं में किसी भी अन्य .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 %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
सरल एक:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
example.com के साथ अपने url को बदलें
अपाचे के साथ एसएसएल को मजबूर करने के लिए। आप उपयोग कर सकते हैं
SSLOptions +StrictRequire
SSLRequireSSL
उपरोक्त उत्तर को पुनर्निर्देशित करने के लिए सही है
इस कोड को आज़माएं, यह सभी तरह के URL के लिए काम करेगा
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]