htaccess को रीडायरेक्ट करने के लिए https: // www


309

मेरा निम्नलिखित htaccess कोड है:

<IfModule mod_rewrite.c>

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

</IfModule>

मैं चाहता हूं कि मेरी साइट https://www.HTTPS के साथ पुनर्निर्देशित की जाए , और www.उपडोमेन को लागू किया जाए , लेकिन जब मैं http://www.(HTTPS के बिना) पहुंचता हूं , तो यह मुझे https://wwwHTTPS के साथ पुनर्निर्देशित नहीं करता है ।


होना चाहिएRewriteCond %{HTTPS} =off
माइकल बर्कोव्स्की

1
अगर मैं ऐसा करता हूं तो यह https: / / ww ww w w पर
बिगबेन

प्रिय @bigben आपने यहाँ एक गलत उत्तर स्वीकार कर लिया है! आपको पता चल सकता है कि मेरे जवाब में इसका गलत क्यों है ।
अमीर फू

जवाबों:


632

पहले HTTPS को लागू करने के लिए, आपको सही वातावरण चर की जाँच करनी चाहिए %{HTTPS} off, लेकिन ऊपर वाला आपका नियम तब www.से लागू होता है जब से आपके पास लागू करने के लिए दूसरा नियम है www., पहले नियम में इसका उपयोग न करें।

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

आसन्न के बारे में

जब प्रॉक्सिंग के कुछ रूपों के पीछे, जिसमें क्लाइंट HTTPS के माध्यम से एक प्रॉक्सी, लोड बैलेंसर, पैसेंजर एप्लिकेशन आदि से कनेक्ट %{HTTPS}हो रहा है , तो चर कभी नहीं हो सकता है onऔर एक फिर से लिखना पाश का कारण बन सकता है। ऐसा इसलिए है क्योंकि आपका एप्लिकेशन वास्तव में सादे HTTP ट्रैफ़िक प्राप्त कर रहा है, भले ही क्लाइंट और प्रॉक्सी / लोड बैलेंसर HTTPS का उपयोग कर रहे हों। इन मामलों में, वैरिएबल के X-Forwarded-Protoबजाय हेडर की जांच करें %{HTTPS}यह उत्तर उचित प्रक्रिया को दर्शाता है


14
कुछ मामलों में आपका प्रमाणपत्र केवल एकल डोमेन के लिए अच्छा हो सकता है (यह www के साथ काम कर सकता है, लेकिन, उदाहरण के लिए, बिना नहीं)। ऐसे मामलों में, पहले सही डोमेन पर रीडायरेक्ट करें, फिर https पर रीडायरेक्ट करें, अन्यथा आपको अपने ब्राउज़र में एक प्रमाणित त्रुटि संदेश मिलेगा।
निक बेन्सन

19
जब मैं इस्तेमाल किया RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]एक यूआरएल की तरह exaple.com/?bla=%20 बन exaple.com/?bla=%2520 , यानी प्रतिशत चिह्न इनकोडिंग किया गया है। NEदोहरे एन्कोडिंग को रोकने के लिए ध्वज का उपयोग करने पर विचार करें :RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
हराया

5
यह मुझे एक सर्वर पर रीडायरेक्ट लूप देता है, दूसरे पर काम करता है। मैं वास्तव में पता नहीं क्यों
user151496

4
@ user151496 क्या विफल सर्वर किसी तरह के HTTP प्रॉक्सी का उपयोग करता है, जैसे वार्निश कैश से गुजर रहा है, या यात्री में? यदि हां, तो आपको वेरिएबल के X-Forwarded-Protoबजाय HTTPS को सत्यापित करने के लिए हैडर की जांच करनी पड़ सकती है %{HTTPS}। आपने यह नहीं बताया कि कौन सा भाग लूप wwwया HTTPS भाग का कारण बनता है , लेकिन यह पहली बात है जो मेरे लिए ध्यान में आती है।
माइकल बेर्कोव्स्की

5
सख्ती से, आपके ऊपर जो दो नियम हैं, वे गलत क्रम में हैं। यदि कोई अनुरोध http://example.com(यानी HTTP और गैर-www) के लिए आता है तो आपको एक डबल रीडायरेक्ट मिलेगा। पहले https://example.com(पहला नियम) और फिर https://www.example.com(दूसरा नियम)। आप इन दोनों नियमों को उलटा कर इसे ठीक कर सकते हैं, क्योंकि दोनों नियम परवाह किए बिना HTTPS पर पुनर्निर्देशित होते हैं।
मृदुफाइट

148

माइकल्स जवाब ने मेरे लिए काम किया, एक छोटे से संशोधन के साथ:

मुसीबत:

जब आपके पास एक एकल साइट सुरक्षा प्रमाणपत्र होता है , तो एक ब्राउज़र जो आपके पेज को https: // www के बिना एक्सेस करने की कोशिश करता है। (या जो भी आपके प्रमाणपत्र को कवर करता है डोमेन) एक बदसूरत लाल चेतावनी स्क्रीन प्रदर्शित करेगा, इससे पहले कि वह सुरक्षित और सही https पृष्ठ पर रीडायरेक्ट प्राप्त कर ले।

समाधान

पहले www (या जो भी आपके प्रमाणपत्र द्वारा कवर किया गया है) पर रीडायरेक्ट का उपयोग करें और उसके बाद ही https रीडायरेक्ट करें। यह सुनिश्चित करेगा कि आपके उपयोगकर्ता किसी भी त्रुटि के साथ सामना नहीं कर रहे हैं क्योंकि आपका ब्राउज़र एक प्रमाण पत्र देखता है जो वर्तमान यूआरएल को कवर नहीं करता है।

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

5
+1 क्योंकि यह इस परिदृश्य के लिए बेहतर विकल्प है, लेकिन ध्यान दें कि यह उसी समस्या को होने से नहीं रोक पाएगा जब ग्राहक पहुंचता है https://example.com, लेकिन मेरी राय में उपयोगकर्ता द्वारा टाइप किए जाने की संभावना कम से कम है। (स्वीकृत उत्तर में भी यही समस्या होगी)
जोशुआ गूसेन

@ लार्जन: यह गलत है। प्रमाणन अपवाद केवल इसलिए होता है क्योंकि आप 2 वास्तविक रीडायरेक्ट करते हैं। "[L, R = 301]" को "[R = 301]" से बदलें। तेरह नियमों का पालन नहीं किया जाता है। L = LAST
डेनिम

यदि आपको केवल प्रमाणपत्र होने के https://बिना संभाल करने की आवश्यकता है , तो बस इस नियम को समाधान में जोड़ें: प्रमाणपत्र त्रुटि से बचने के लिए कनेक्ट करने का प्रयास करते समय यह बस वापस चला जाता है । wwwwwwRewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]httphttps://example.com
एरिक ब्यूरेल

1
दो नियमों को वैसे भी उलट दिया जाना चाहिए (जैसा आपने किया है), अनुरोध करते समय दोहरे पुनर्निर्देशन को रोकने के लिए http://example.com(यानी। HTTP और कोई www)
MrWhite

@EricBurel आप इस उदाहरण में प्रमाणित त्रुटि से बच नहीं सकते - आपके कोड के निष्पादन से पहले SSL हैंडशेक होता है (जो पहले स्थान पर SSL का पूरा बिंदु है)। यदि आपका रीडायरेक्ट ब्राउज़र सर्टिफिकेट एरर से पहले निष्पादित करने में सक्षम था, तो इसका अर्थ यह होगा कि अनुरोध पहले से ही असुरक्षित कनेक्शन पर किया गया था - जो एसएसएल मॉडल में एक मौलिक असफलता होगी।
MrWhite

99

यदि आप CloudFlare या एक समान CDN का उपयोग कर रहे हैं, तो आपको यहां उपलब्ध% {HTTPS} समाधान के साथ एक अनंत लूप त्रुटि मिलेगी। यदि आप CloudFlare उपयोगकर्ता हैं, तो आपको इसका उपयोग करने की आवश्यकता होगी:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
कृपया ध्यान दें कि क्लाउडफ्लेयर समर्थन साइट पर वर्तमान सलाह थोड़ी अलग है: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott

1
@ H0mayun के साथ सहमत, Cloudflare सलाह पुनर्निर्देशित लूप में परिणाम देती है, जबकि यहाँ यह कोड पूरी तरह से काम करता है - धन्यवाद!
होबेली

2
मैं ec2 पर angularjs चलाता हूं। रेवेरिटकंड% {HTTPS}! = का उपयोग करते हुए समाधान मुझे अनंत पुनर्निर्देशन देते हैं (पूरी तरह से निश्चित नहीं है कि क्यों)। एक्स-फॉरवर्डेड-प्रोटो के साथ यह समाधान, चाल करने के लिए लगता है। धन्यवाद!
मार्क वाटकिंस

3
मैंने अपने वातावरण के लिए संशोधित =httpकिया !=httpsX-Forwarded-Protoअगर http, ऐसा !=httpsनहीं है , तो हेडर घोषित किया गया था।
जॉनथन एलमोर

इस अंतर्दृष्टि के लिए धन्यवाद! मैंने यह जानने में घंटों की कोशिश की कि {HTTPS}काम क्यों नहीं किया गया। मैंने कोशिश की {ENV:HTTPS}और यहां तक ​​कि {SERVER_PORT} 443, लेकिन अंत में यह था क्योंकि मुझे Cloudflare के कस्टम HTTP अनुरोध हेडर के लिए जांच करने की आवश्यकता थी।
camslice

56

बुरा समाधान और क्यों!

नीचे दिए गए समाधान का उपयोग कभी न करें क्योंकि जब आप उनके कोड का उपयोग कर रहे हैं जो कुछ इस तरह है:

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

ब्राउज़र को जाता है:

http://example.com

फिर इसे पुनर्निर्देशित करता है:

https://example.com

फिर इस पर पुनर्निर्देश करता है:

https://www.example.com

यह सर्वर के लिए बहुत अधिक अनुरोध है।

अधिकांश जवाब भी स्वीकार किए जाते हैं कि इस समस्या है।


सबसे अच्छा समाधान और जवाब

इस कोड [OR]में url पर दोहरे परिवर्तनों को रोकने के लिए एक शर्त है!

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

3
"बुरा समाधान और क्यों!" - वे नियम सिर्फ गलत क्रम में हैं। उन दो नियमों को उलट दें और यह सही होगा - आपको केवल एक अनुप्रेषण मिलेगा और दो नहीं।
MrWhite

4
हां, कोड को 2 रीडायरेक्ट में दिए गए परिणाम के रूप में - मैं विवादित नहीं हूं - मैं यह सब कह रहा हूं कि आपको इस समस्या को हल करने के लिए बस इन नियमों को उलटने की आवश्यकता है, किसी अन्य परिवर्तन की आवश्यकता नहीं है। ("स्वीकार किया गया" उत्तर वास्तव में गलत है - जो ऐसा प्रतीत होता है जिसे आप संदर्भित कर रहे हैं - निर्देश गलत क्रम में हैं।)
MrWhite

1
yup @AmirForsati सही है। यह दो बार पुनर्निर्देशित है और यह स्वीकृत उत्तर होना चाहिए।
जाकिर हुसैन

4
यदि आप डोमेन नाम परिवर्तनशील रखना चाहते हैं तो आप इसका उपयोग कर सकते हैं:RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
I.devries

यह मुझे wp-content/cache/page_enhanced/और फिर इतने पर पुनर्निर्देशित कर रहा है । मैं इसे कैसे ठीक करूं? संपादित करें: ऐसा लगता है कि मुझे इसे सबसे ऊपर रखने की आवश्यकता है .htaccess। स्क्रिप्ट के लिए धन्यवाद :)
Giacomo

35

यह सबसे अच्छा तरीका है जो मैंने प्रॉक्सी के लिए पाया है न कि प्रॉक्सी यूजर्स के लिए

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
यह सही तरीका है जो मैंने प्रॉक्सी के लिए पाया है न कि प्रॉक्सी यूजर्स +1
डीप 3015

1
यह सबसे अच्छा एक है, क्योंकि यह कई 301 पुनर्निर्देशित करता है
चौहान

1
सबसे अच्छा समाधान कभी।
एसएम जोबियर आलम

1
बहुत बढ़िया जवाब। यह एकमात्र ऐसा है जिसने मेरे लिए काम किया। यदि आप Cloudflare के पीछे हैं, तो काम करता है (हालांकि मेरे पास Cloudflare में कोई पृष्ठ नियम नहीं हैं)।
जसनको

एकमात्र समाधान जो मेरे सभी मामलों पर काम करता है। लेकिन क्या होगा अगर मैं डी ओपोसिट करना चाहता हूं और सभी "www।"
FedeKrum

27

वहाँ बहुत सारे समाधान हैं। यहां अपाचे विकी का लिंक दिया गया है जो सीधे इस मुद्दे से संबंधित है।

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [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/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

मैं पुनर्लेखन की स्थिति RewriteCond %{HTTPS} offको RewriteCond %{HTTPS} !=onउस पुनर्निर्देशन से बदलकर हमेशा पाया, यह मेरे लिए बेहतर उत्तर लगता है।
सैम्युअल हॉक्सबी-रॉबिन्सन

इस समाधान को एक सही उत्तर के रूप में स्वीकार किया जाना चाहिए! मेरे लिए भी काम किया!
एंड्रयूस्मिग

11

Http: // या https: // से https: // www पर पुनर्निर्देशित करने के लिए आप अपाचे के सभी संस्करणों पर निम्नलिखित नियम का उपयोग कर सकते हैं:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

अपाचे २.४

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

ध्यान दें कि अपाचे 2.4 के बाद से% {REQUEST_SCHEME} चर उपयोग के लिए उपलब्ध है ।


1
समस्या !: अगर HTTP_HOST में पहले से ही www है। लेकिन योजना HTTPS नहीं है, तो आप www.www। आपके मेजबान में
Jpsy

@ Jpsy तुम सही हो। मैंने रीडायरेक्ट गंतव्य को अपडेट कर दिया है। आपके सहयोग के लिए धन्यवाद।
स्टारकास्ट

1
यह लगभग वही है जो मैं देख रहा था लेकिन मैं अन्य उदाहरणों की तरह डोमेन सामान्य रखना चाहता हूं। क्या यह संभव है?
क्रोनोकली

8

यदि आप CloudFlare पर हैं, तो सुनिश्चित करें कि आप कुछ इस तरह का उपयोग करते हैं।

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

यह आपको रीडायरेक्ट लूप से बचाएगा और आपकी साइट को एसएसएल में सुरक्षित रूप से रीडायरेक्ट करेगा।

पुनश्च यह एक अच्छा विचार है अगर mod_rewrite.c की जाँच करें!


यह https: // theurlwithoutwww.com को https: // www पर पुनर्निर्देशित नहीं करता है।
thesearentthedroids

यह वास्तव में केवल कार्यशील समाधान है यदि आपके पास पहले से कुछ "ऐड www" निर्देश हैं। अन्य समाधान मुझे "कई पुनर्निर्देशन" देते हैं।
डैनियल पी।


2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

नोट: सुनिश्चित करें कि आपने निम्नलिखित कदम उठाए हैं

  1. सुडो a2enmod फिर से लिखना
  2. sudo service apache2 पुनरारंभ
  3. /Etc/apache2/sites-available/000-default.nf पर स्थित अपनी vhost फ़ाइल में निम्नलिखित जोड़ें।
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

अब आपका .htaccess काम करेगा और आपकी साइट http: // से https: // www पर रीडायरेक्ट होगी


1

अमीर फोर्सटी के समाधान की तरह htaccess को https: // www पर पुनर्निर्देशित किया गया, लेकिन चर डोमेन नाम के लिए, मेरा सुझाव है:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]

0

अपनी .htaccess फ़ाइल में सेट करें

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

0

मैंने इस वेबसाइट से नीचे दिए गए कोड का उपयोग किया है, यह महान काम करता है https://www.freecodecamp.org/news/how-to-redirect-http-to-https-use-htaccess/

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

आशा है ये मदद करेगा


-2

मैं पहले जवाब की कोशिश करता हूं और यह काम नहीं करता है ... यह काम:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

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