2009-07-10 16 views
19

का उपयोग कर HTTP और HTTPS के बीच सही रूप से स्विचिंग हमारे पास एक शॉपिंग साइट है जिसे हम साझा होस्ट (Mediatemple Gridserver) पर होस्ट कर रहे हैं। साइट के कुछ हिस्सों में HTTPS (चेकआउट इत्यादि) का उपयोग करने की आवश्यकता है लेकिन बाकी को HTTP का उपयोग करना चाहिए।.htaccess

क्या कोई जानता है कि हम हमेशा विशेष URL के लिए HTTP/HTTPS के सही उपयोग को कैसे बल दे सकते हैं? हमने इसे विभिन्न राज्यों में काम किया है, लेकिन हमें उस पृष्ठ के लिए अनुरोध नहीं मिल सकता है जो HTTP पर होना चाहिए लेकिन एचटीटीपीएस से सही तरीके से स्विच करने के लिए अनुरोध किया जाता है।

मैंने SO के आसपास एक नज़र डाली है लेकिन इसका कोई उपयुक्त उत्तर नहीं मिला।

+0

यह इनको साथ रहना है? कौन-सी भाषा साइट? – random

+0

का उपयोग कर आप क्या पहले https को रोकने के लिए कोशिश कर रहे हैं? –

उत्तर

33

मैं वर्डप्रेस में अपने व्यवस्थापक फ़ोल्डर के लिए यह करने के लिए कुछ इसी तरह का उपयोग करें:

#redirect all https traffic to http, unless it is pointed at /checkout 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/checkout/?.*$ 
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

RewriteCond %{HTTPS} on भाग सभी वेब सर्वर के लिए काम नहीं कर सकते हैं। उदाहरण के लिए, मेरे वेबहोस्ट को RewriteCond %{HTTP:X-Forwarded-SSL} on की आवश्यकता है।

आप रिवर्स मजबूर करने के लिए चाहते हैं, की कोशिश:

#redirect all http traffic to https, if it is pointed at /checkout 
RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/checkout/?.*$ 
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

आप कुछ वैकल्पिक तरीके यह करने के लिए, askapache की जाँच करें।

+0

मैं पर कोड की जाँच की है मेरी सर्वर, ऊपर सूचीबद्ध दोनों ब्लॉक का उपयोग करके, और यह कोई रीडायरेक्ट लूप के साथ ठीक काम करता है। –

+0

+1। महान उत्तर। 'रीव्राइटकंड% {HTTP: X-Forwarded-SSL} पर मेरे मामले में आवश्यक था क्योंकि मैं रैकस्पेस के क्लाउड का उपयोग कर रहा हूं साइटों। –

+2

[@ विल्मोरोर] [http://stackoverflow.com/questions/1108706/correctly-switching-between-http-and-https-using-htaccess/#9917579) '% {SERVER_NAME}' अतिरिक्त उपयोग का सुझाव उपयोगी होगा – antitoxic

0

मुझे लगता है कि यह होना चाहिए:

RewriteCond %{HTTPS} =on 
^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

देखें mod_rewrite प्रलेखन।

13

यह काफी हर स्थिति में काम करना चाहिए और अपने वास्तविक vhost या .htaccess में काम करना चाहिए:,

RewriteEngine on 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(% {REQUEST_URI} से पहले स्लेश मत भूलना के रूप में यह एक portnumber गुजर अनुमति दे सकता है जो खतरनाक है)

+1

आपका उत्तर, जबकि सुरुचिपूर्ण, एक छोटी गलती है। अंतिम पंक्ति में SERVER_NAME के ​​बाद स्लैश (/) होना चाहिए, या www.test.com/dir आगे http: //www.test.comdir – Juhani

+0

@ जुहानी आपकी टिप्पणी के लिए धन्यवाद होना चाहिए। असल में, {REQUEST_URI} पर्यावरण परिवर्तक के लिए% 1 मानचित्र जो मूल सापेक्ष हैं। दूसरे शब्दों में, यदि आपने http://example.com/123 का अनुरोध किया है, तो REQUEST_URI === '/ 123'; इस प्रकार, एक और स्लैश अनिवार्य होगा। यह अभी भी काम करेगा क्योंकि अधिकांश आधुनिक विन्यास में, अपाचे अतिरिक्त स्लैश को बंद कर देगा। जब तक आप अपाचे को अधिक काम नहीं करते हैं, आपको स्लैश की आवश्यकता नहीं है। ऐसा कहा जा रहा है कि, मैंने% 1 के बजाय% {REQUEST_URI} का उपयोग करने के लिए अपना मूल उत्तर अपडेट किया क्योंकि यह अधिक इरादा खुलासा है। –

+0

@ विल्मोमोर: यह सही है जब विकल्प सर्वर कॉन्फ़िगरेशन फ़ाइल में रखे जाते हैं, क्योंकि रीराइट इंजन [हुक] (http://httpd.apache.org/docs/2.4/rewrite/tech.html) URL-to- फ़ाइल नाम-अनुवाद। हालांकि, जब एक [प्रति-निर्देशिका] (http://httpd.apache.org/docs/2.4/rewrite/intro.html#htaccess) कॉन्फ़िगरेशन फ़ाइल में रखा जाता है, तो यूआरआई पहले से ही पथनाम में मैप किया गया है इंजन चरणों को फिर से लिखना। पुनः लिखने वाला इंजन निर्देशिका उपसर्ग को अलग करके इसे संभालता है, जो अग्रणी '/' को हटा देता है, और परिणाम के विरुद्ध मेल खाता है। – outis

1

this answer में विस्तृत के रूप में, आवश्यक होने पर https:// लिंक का उपयोग करने के लिए अपने एप्लिकेशन को ठीक करें। स्वचालित पुनर्निर्देशन पर भरोसा न करें, इससे आपको सुरक्षा की झूठी भावना हो सकती है यदि आपने https:// पर अपने लिंक/फॉर्म नहीं दिए हैं, तो https:// URL पर भी जाएं। mod_rewrite का उपयोग करके स्वचालित रूप से ऐसी गलतियों का पता लगाना मुश्किल हो जाता है (जो कमजोरियां भी हो सकती हैं)।

5
RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

मुझे लोडबॉलंसर के पीछे कुछ समस्या थी। यह मैंने इसे कैसे तय किया।

+0

क्या वह वास्तव में काम करता है? यह मुझे एक रीडायरेक्ट पाश में फेंक दिया। यदि आपके पास लोडबैंसर है, तो HTTPS सेट नहीं किया जाएगा और पहला रीवाइटकंड पूरा हो जाएगा। यदि आप नहीं करते हैं, तो दूसरा रिवाइटकंड पूरा हो जाएगा। इस प्रकार हर बार आप फिर से पुनर्निर्देशित हो जाएगा। मुझे यह (एक और जवाब) का उपयोग करके काम कर रहा है [http://stackoverflow.com/a/26623196/2182900] जो मूल रूप से वही बात है लेकिन '[OR]' के बिना - आप केवल तब रीडायरेक्ट करते हैं जब दोनों HTTPS बंद हैं और HTTP : एक्स-फॉरवर्ड-प्रोटो https नहीं है। –

+0

यह मेरे लिए पूरी तरह से काम करता है। धन्यवाद! –

1

मेरे लिए यह काम किया (मैंने इसे WordPress साइट के लिए उपयोग किया और HTTPS पर रीडायरेक्ट किया)। तुम बस RewriteEngine और RewriteBase लाइनों के पीछे हालत और नियम लाइनों को जोड़ने के लिए है:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 
# (end of custom modifications) 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 

RewriteCond %{HTTP:X-Forwarded-Proto} !https हालत के लिए एक नज़र - केवल इस अपने सर्वर होस्टिंग के लिए काम किया। (मैं RewriteCond %{SERVER_PORT} !^443$ या RewriteCond %{HTTPS} off रूप में अच्छी तरह कोशिश की, लेकिन सफलता नहीं मिली।