अपाचे नॉन www से www तक रीडायरेक्ट करता है


206

मेरे पास एक ऐसी वेबसाइट है जो गैर-www से www तक रीडायरेक्ट नहीं करती है।

मेरा अपाचे विन्यास इस प्रकार है:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

मैं क्या खो रहा हूँ?


1
एक .htaccessआधारित समाधान के लिए मैं एक उत्तर देता हूं जो कि व्यास के प्रश्न पर लगाया गया है: stackoverflow.com/a/5262044/367456
hakre

यह अच्छा है, यह हालांकि url में एक स्लैश जोड़ता है, इसलिए डॉलर से पहले स्लैश खो दें।
वूक्सिमिया सेप

जवाबों:


510

इस समस्या को हल करने के लिए रीराइट इंजन का उपयोग करना एक बहुत ही भारी तरीका है। यहाँ एक सरल उपाय है:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

और फिर आपके पास अपने वास्तविक सर्वर कॉन्फ़िगरेशन के लिए एक और <VirtualHost>अनुभाग होगा ServerName www.example.comनिर्देश/ का उपयोग करने के बाद अपाचे स्वचालित रूप से कुछ भी संरक्षित करता है, जो एक आम गलत धारणा है कि यह विधि क्यों काम नहीं करेगी (जब वास्तव में ऐसा होता है)।Redirect


20
आप इसे एक साइट के लिए कैसे करते हैं जिसमें एसएलएल वर्चुअल होस्ट भी है?
Shabbyrobe

28
मुझे इस सुझाव का उपयोग करते समय त्रुटि "उदाहरण के लिए वेबपेज example.com पर बहुत अधिक रीडायरेक्ट मिली है"। क्या दूसरों को यह समस्या है?
जोनाथन बर्जर

4
@ ब्लैकडिवाइन: इसे दूसरी दिशा में करने के बारे में कुछ भी जादुई नहीं है। बस स्वैप www.exampleऔर exampleजहाँ भी वे नमूने में दिखाई देते हैं।
ग्रेग हेविगिल

11
@JonathanBerger यदि आप बहुत अधिक रीडायरेक्ट करते हैं, तो आपने शायद फ़ाइल को अच्छी तरह से कॉन्फ़िगर नहीं किया है। सुनिश्चित करें कि 2 VirtualHosts हैं: एक गैर-www के साथ जो ऊपर है और दूसरा सर्वरनेम www.example.com के साथ है जिसमें वास्तविक कॉन्फ़िगरेशन है। यह भी सुनिश्चित करें कि www.example.com कॉन्फ़िगरेशन (साथ ही mod_alias और mod_rewrite दोनों) में कोई रीडायरेक्ट नहीं है।
सवास वेदोवा

3
एक आभासी होस्ट सर्वर के लिए, मेरे पास है example.com कहते हैं, Redirect 301 / http://example2.com/extra/लेकिन जब यह पुनर्निर्देश, यह स्लैश याद करते हैं, जिसका अर्थ है कि example.com/blahकरने के लिए चला जाता है example2.com/extrablah। कोई विचार? (अपाचे २.२.२२)
पीटर होवे

87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
बहुत छोटा जवाब ... लेकिन अंकों के लिए ... निश्चित नहीं है कि यह एक ऊपर या नीचे वोट है
thecoshman

2
ओह, यह साफ है, यह शीर्ष स्तर पर सर्वर कॉन्फिगर में शामिल किया जा सकता है (और यदि ऐसा है) तो हर वर्चुअल होस्ट पर लागू होगा!
तत्पश्चात

नमस्कार @burzumko आप इसे कैसे प्राप्त करते हैं, जो www के बिना सभी के लिए सच है, लेकिन फिर, बिना www के जाने दें example.com/subdi1/ws/* ?
काली इंद्री

1
मैंने इस समाधान का उपयोग HTTPS वर्चुअल होस्ट के लिए भी किया है। बस sतीसरी पंक्ति में एक http जोड़ें ।
कृपालुप्राप

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

यह मेरे लिए काम नहीं किया; इसने एक ही साइट पर अनंत अनुप्रेषित लूप का कारण बना
dmiller309

1
@ dmiller309: आप को शामिल किया है करने के लिए होता है www.में ServerAlias?
चेरोविम

2
तुम सही हो, मैं गलती से www। ServerAlias ​​में * का उपयोग कर। वाइल्डकार्ड। क्योंकि मैंने VirtualHost प्रविष्टियों के क्रम को गड़बड़ कर दिया है, *। वाइल्डकार्ड के पास मैच का अवसर था जब मुझे नहीं लगा कि यह होगा।
dmiller309

7
यह सबसे अच्छा उत्तर है, क्योंकि यह साफ है, पथ रखता है (उत्तर # 1 के विपरीत) और रीराइट का उपयोग नहीं करता है।
स्काइफेरस्टापेल

30

wwwअपनी URLवेबसाइट से हटाने के लिए अपनी .htaccessफ़ाइल में इस कोड का उपयोग करें :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1$1 [R=301,L]

wwwअपनी वेबसाइट में लागू करने के URLलिए इस कोड का उपयोग करें.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

YourSite.comआपकी जगह कहां होनी चाहिए URL


सबसे अच्छा जवाब यहां, क्योंकि यह कई डोमेन नामों के साथ वेबसाइट के लिए काम करता है <3
क्लेमेंट हेरमैन

2
.Html के लिए दूसरा भाग क्या है ??
नाथन एच।

6
$ 1 से पहले स्लैश निकालें। पुनर्निर्देशन के बाद डबल स्लैश (//) नहीं है => फिर से लिखना करें ^ (। *) $ YourSite.com $ 1 [R = 301]
केविन कैम्पियन

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

ऊपर दिए गए कोड के साथ ऐसा ही होता है। यदि अनुरोध www.example.com है और उस निर्देशिका में आपकी वेबसाइट चलाता है तो पहला वर्चुअल होस्ट ब्लॉक चेक करता है।

असफल होने पर, यह दूसरे वर्चुअल होस्ट सेक्शन में आता है। यहां www.example.com के अलावा कुछ भी www.example.com पर पुनर्निर्देशित किया गया है।

यहां आदेश मायने रखता है। यदि आप पहले दूसरा virtualhost निर्देश जोड़ते हैं, तो यह एक अनुप्रेषित लूप का कारण होगा।

यह समाधान आपके डोमेन के किसी भी अनुरोध को www.yourdomain.com पर पुनर्निर्देशित कर देगा।

चीयर्स!


16

यह एक जोड़े को बढ़ाने के साथ अन्य सुझावों के समान है:

  • डोमेन को हार्डकोड करने की आवश्यकता नहीं है (vhosts के साथ काम करता है जो कई डोमेन या वातावरण के बीच स्वीकार करता है)
  • योजना (http / https) को संरक्षित करता है और पिछले %{REQUEST_URI}नियमों के प्रभावों की अनदेखी करता है।
  • पिछले हिस्से की RewriteRuleतरह प्रभावित पथ भाग नहीं %{REQUEST_URI}है।

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    

4
लगभग आदर्श। यह% {HTTP_HOST} $ 1 होना चाहिए,% {HTTP_HOST} / $ 1 (या यह स्लैश को दोगुना कर देगा)
माइकल व्याराज़

@ मिचेल व्रिज: यहां स्लैश दोगुना नहीं है ?!
not2savvy

10
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

यह HTTP_HOSTचर के साथ शुरू होता है , जिसमें आने वाले URL का डोमेन नाम भाग होता है ( example.com)। मान लिया जाए कि डोमेन नाम में कोई शामिल नहीं है www.और आपके डोमेन नाम से बिल्कुल मेल खाता है, तो रिवर्टयूल खेलने में आता है। पैटर्न ^(.*)$सब कुछ से मेल खाएगा REQUEST_URI, जो HTTP अनुरोध ( foo/blah/index.html) में अनुरोधित संसाधन है । यह इसे एक बैक रेफ़रेंस में संग्रहीत करता है, जो तब नए डोमेन नाम (जो शुरू होता है www) के साथ URL को फिर से लिखने के लिए उपयोग किया जाता है ।

[NC]केस-असंवेदनशील पैटर्न मिलान [R=301]इंगित करता है , कोड 301 (संसाधन स्थायी रूप से स्थानांतरित) का उपयोग करके एक बाहरी रीडायरेक्ट इंगित करता है, और [L]आगे के सभी पुनर्लेखन को रोकता है, और तुरंत रीडायरेक्ट करता है।


6

गैर-www => www और विपरीत www => गैर-www दोनों के लिए पुनर्निर्देशन कोड। कोई हार्डकॉन्ग डोमेन और स्कीम .htaccess फ़ाइल में नहीं। इसलिए मूल डोमेन और http / https संस्करण संरक्षित किया जाएगा।

APACHE 2.4 और NEWER

गैर-डब्ल्यूडब्ल्यूडब्ल्यू => डब्ल्यूडब्ल्यूडब्ल्यू:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NON-WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]

नोट: Apache 2.2 पर काम नहीं कर रहा है जहाँ% {REQUEST_SCHEME} उपलब्ध नहीं है। Apache 2.2 के साथ संगतता के लिए नीचे दिए गए कोड का उपयोग करें या% http: // REQUEST_SCHEME} को http / https के साथ बदलें।


APACHE 2.2 और नया

गैर-डब्ल्यूडब्ल्यूडब्ल्यू => डब्ल्यूडब्ल्यूडब्ल्यू:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

... या छोटा संस्करण ...

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NON-WWW:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

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

... छोटा संस्करण संभव नहीं है क्योंकि% N केवल पिछले रिवर्टकॉन्ड से उपलब्ध है ...


अपाचे 2.4 विन्यास ने इस मुद्दे को तय किया, स्वच्छ उत्तर के लिए धन्यवाद .. !!
किम्चीमन

5

मैंने इसे चलाया ...

 RewriteEngine on
 RewriteCond %{HTTP_HOST} !^www.*$ [NC]
 RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

मुझे अपने नए सर्वर पर 25+ डोमेन के लिए सार्वभौमिक होने की आवश्यकता है, इसलिए यह निर्देश <निर्देशिका निर्देशिका में मेरे virtual.conf फ़ाइल में है। (dir सभी docroots के लिए जनक है)

मुझे फिर से लिखना नियम पर थोड़ा सा हैक करना था, क्योंकि http://httpd.apache.org/docs/2.2/mod/mod/rewrite.html के अनुसार , पूर्ण मिलान प्रारूप पैटर्न मैच के माध्यम से किया जा रहा था। इसके बारे में केवल मेजबान और बंदरगाह के बाद सामान है।


5

यदि आप अपाचे 2.4 का उपयोग कर रहे हैं, तो अपाचे माच मॉड्यूल को सक्षम करने की आवश्यकता के बिना आप कुछ इस तरह का उपयोग कर सकते हैं:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
अधूरा जवाब। इसके उपयोग से, अतिरिक्त vhosts से बचा जा सकता है जो स्वचालित LetEncrypt स्क्रिप्ट के लिए अच्छा है।
पॉल

इसके अलावा, यदि आप ANSIBLE का उपयोग कर रहे हैं, तो ANSIBLE 2.0 के बाद से आप अब आसानी से एक कार्य में एक फ़ाइल में एक ब्लॉक डाल सकते हैं, अधिक विवरण यहाँ docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

Www पर पुनर्निर्देशित domain.tld।

निम्नलिखित लाइनें अपाचे निर्देशों में या .htaccess फ़ाइल में जोड़ी जा सकती हैं:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • अन्य sudomains अभी भी काम कर रहे हैं।
  • लाइनों को समायोजित करने की आवश्यकता नहीं है। बस उन्हें सही जगह पर कॉपी / पेस्ट करें।

यदि आप vhost को संशोधित करते हैं तो अपाचे परिवर्तन लागू करना न भूलें।

(डिफ़ॉल्ट Drupal7 .htaccess के आधार पर लेकिन कई मामलों में काम करना चाहिए)


3

यह सरल है!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

यह न केवल डोमेन नाम बल्कि आंतरिक पेजों को भी रीडायरेक्ट करेगा। example ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


इसके लिए धन्यवाद। बहुत मददगार।
एंथनी


2

हमेशा उपयोग न करें Redirect permanent(या यह भविष्य में समस्या क्यों पैदा कर सकता है)

यदि कोई मौका है कि आप बाद में उप-डोमेन जोड़ देंगे, तो उपयोग न करें redirect permanent

क्योंकि अगर एक ग्राहक ने एक उपडोमेन का उपयोग किया है जो कि रजिस्टर्ड नहीं किया गया था, VirtualHostतो वह कभी भी इस उपडोमेन तक नहीं पहुंच सकता है जब वह बाद में रजिस्टर्ड हो जाता है।

redirect permanentHTTP 301 Moved Permanentlyक्लाइंट (ब्राउज़र) को भेजता है और उनमें से बहुत से इस प्रतिक्रिया को हमेशा के लिए कैश कर देते हैं (जब तक कि कैश को साफ नहीं किया जाता है [मैन्युअल रूप से])। तो उस उपडोमेन का उपयोग हमेशा www। *** के लिए किया जाएगा। सर्वर को फिर से अनुरोध किए बिना।

देखना कितना समय ब्राउज़रों कैश करते HTTP 301s?

तो बस उपयोग करें Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - जब mod_rewrite का उपयोग नहीं करना है

Apache.org - कैनोनिकल होस्टनाम



0

मुझे बस एक ही समस्या है। लेकिन इससे हल हो गया

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

यह नियम गैर-www को www पर पुनर्निर्देशित करता है।

और यह नियम www को गैर-www पर पुनर्निर्देशित करता है

RewriteEngine On RewriteCond %{HTTP_HOST} !^my-domain\.com$ [NC] RewriteRule ^(.*)$ http://my-domain.com/$1 [R=301,L]

Http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/ से देखें


0

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

RewriteCond %{HTTP_HOST} ^(?!www.domain.com).*$ [NC]
RewriteRule ^(.*)$  http://www.domain.com$1  [R=301,L]

मैं सबडोमेन (?!www.domain.com)को बाहर करने के लिए लुक-फॉरवर्ड पैटर्न का उपयोग करता हूं wwwजब wwwअपाचे में एक अनंत रीडायरेक्ट लूप से बचने के लिए सभी डोमेन को उपडोमेन पर पुनर्निर्देशित करता है।


0

मेरे द्वारा उपयोग किया जाने वाला कोड है:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

0

-यदि आप कई डोमेन नाम (वैकल्पिक) होस्ट करते हैं

-यदि उन सभी डोमेन नाम https का उपयोग कर रहे हैं (जैसा कि उन्हें करना चाहिए)

-यदि आप उन सभी डोमेन नामों को www डॉट डोमेननाम का उपयोग करना चाहते हैं

यह doble redirection (http: // non www से http: // www और फिर https: // www) से बच जाएगा

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

तथा

<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

आपको पुनर्निर्देशन कोड 301 को सबसे सुविधाजनक में बदलना चाहिए


-1

यदि <VirtualHost *:80>विभिन्न ServerNameएस के साथ दो ब्लॉक के उपरोक्त समाधान का उपयोग कर ...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... तो आप सेट करना होगा NameVirtualHost Onऔर साथ ही

यदि आप ऐसा नहीं करते हैं, तो Apache ServerNameब्लॉक को अलग करने के लिए अलग-अलग s का उपयोग करने की अनुमति नहीं देता है , इसलिए आपको यह त्रुटि संदेश मिलता है:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... और या तो कोई पुनर्निर्देशन नहीं होता है, या आपके पास एक अनंत पुनर्निर्देशन लूप है, जिसके आधार पर आप पहले ब्लॉक करते हैं।


-1

मैं एक WP मल्टीसाइट पर एक समान कार्य करता था, जहां पुनर्निर्देशन नियम को सामान्य होना चाहिए (किसी भी डोमेन के लिए जो मैं नेटवर्क में जोड़ूंगा)। मैंने डोमेन (पार्क किए गए डोमेन) में वाइल्डकार्ड जोड़ने से पहले हल किया। ध्यान दें । के बाद .com।

CNAME * domain.com.

और फिर मैंने अपने मल्टीसिट के मूल में .htaccess फ़ाइल में निम्न पंक्तियाँ जोड़ीं। मुझे लगता है कि यह किसी भी साइट के लिए काम करेगा।

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

उम्मीद है कि इससे मदद मिलेगी।

ps। यदि आप www से www में अनुप्रेषित करना चाहते हैं, तो अंतिम पंक्ति को बदल दें

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

-2

मुझे यह आसान (और अधिक उपयोगी) पाया गया कि कई vhosts का उपयोग करते समय ServerAlias ​​का उपयोग करें।

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

यह भी https vhosts के साथ काम करता है।


एक और ड्राइव-डाउन द्वारा। समझाने की परवाह करो, http के ओह ताकतवर भगवान जो परेशान करने के लिए परेशान नहीं किया जा सकता है?
एंथनी

1
इससे ऐसा होता है कि आपके पास एक ही साइट को होस्ट करने वाले कई डोमेन हैं। आपकी स्थितियों और आपके अंतर्निहित वेबसर्वर के आधार पर आप जो कुकीज़ ले जा रहे हैं उन मुद्दों को लेकर नहीं जा रहे हैं, लोग भ्रमित हैं, और खोज इंजन समस्याओं (जो इसे 2 अलग-अलग साइटों के रूप में देखेंगे)।
जेफरी वैन एलस्टाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.