redirect Nginx नो-www www और www से नो-www




ubuntu rackspace (12)

मैं ट्यूटोरियल के बाद रैकस्पेस क्लाउड पर nginx का उपयोग कर रहा हूं और नेट की खोज कर रहा हूं और अब तक इसे हल नहीं किया जा सकता है।

मैं www.mysite.com को एसईओ और अन्य कारणों के लिए .htaccess में सामान्य के रूप में mysite.com पर जाना चाहता हूं।

मेरा /etc/nginx/sites-available/www.example.com.vhost कॉन्फ़िगरेशन:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

मैंने भी कोशिश की है

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

मैंने भी कोशिश की। दोनों दूसरे प्रयास रीडायरेक्ट लूप त्रुटियां देते हैं।

if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

मेरा DNS मानक के रूप में सेट है:

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(उदाहरण आईपी और फ़ोल्डर्स उदाहरण के लिए इस्तेमाल किए गए हैं और भविष्य में लोगों की मदद के लिए)। मैं उबंटू 11 का उपयोग करता हूं।


आप पाएंगे कि आप अधिक डोमेन के लिए एक ही कॉन्फ़िगरेशन का उपयोग करना चाहते हैं।

निम्नलिखित स्निपेट किसी भी डोमेन से पहले www को हटा देता है:

if ($host ~* ^www\.(.*)$) {
    rewrite / $scheme://$1 permanent;
}

दरअसल आपको एक पुनर्लेख की भी आवश्यकता नहीं है।

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

चूंकि मेरा जवाब अधिक से ज्यादा वोट प्राप्त कर रहा है लेकिन ऊपर भी। आपको इस संदर्भ में rewrite का कभी भी उपयोग नहीं करना चाहिए। क्यूं कर? क्योंकि nginx को एक प्रक्रिया को संसाधित करना और शुरू करना है। यदि आप return उपयोग करते return (जो किसी भी nginx संस्करण में उपलब्ध होना चाहिए) यह सीधे निष्पादन रोकता है। यह किसी भी संदर्भ में पसंद किया जाता है।

दोनों गैर-एसएसएल और एसएसएल को उनके गैर-www समकक्ष को पुनर्निर्देशित करें:

server {
    listen               80;
    listen               443 ssl;
    server_name          www.example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    return 301 $scheme://example.com$request_uri;
}

server {
    listen               80;
    listen               443 ssl;
    server_name          example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    # rest goes here...
}

$scheme वैरिएबल में केवल http यदि आपका सर्वर केवल पोर्ट 80 (डिफ़ॉल्ट) पर सुन रहा है और सुनो विकल्प में ssl कीवर्ड नहीं है। चर का उपयोग नहीं करने से आपको कोई प्रदर्शन नहीं मिलेगा।

ध्यान दें कि यदि आप एचएसटीएस का उपयोग करते हैं तो आपको और भी सर्वर ब्लॉक की आवश्यकता है, क्योंकि एचएसटीएस हेडर को गैर-एन्क्रिप्टेड कनेक्शन पर नहीं भेजा जाना चाहिए। इसलिए, आपको रीडायरेक्ट और एचएसटीएस हेडर के साथ रीडायरेक्ट और एन्क्रिप्टेड सर्वर ब्लॉक के साथ अनएन्क्रिप्टेड सर्वर ब्लॉक की आवश्यकता है।

एसएसएल में सबकुछ रीडायरेक्ट करें (आईपीवी 4, आईपीवी 6, एसपीडीवाई, के साथ यूनिक्स पर व्यक्तिगत कॉन्फ़िगरेशन ...):

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

    return 301 https://example.com$request_uri;
}

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

    return 301 https://example.com$request_uri;
}

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

मुझे लगता है कि आप अपने आप से इस पैटर्न के साथ अन्य यौगिकों की कल्पना कर सकते हैं।

मेरी अधिक विन्यास? here और here जाओ।


इसे इस्तेमाल करे

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com$1;
    }

अन्य तरीका: www के लिए Nginx no-www

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

और www से नो-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}

अगर आपको यह काम करने में परेशानी हो रही है, तो आपको अपने सर्वर का आईपी पता जोड़ना पड़ सकता है। उदाहरण के लिए:

server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}

जहां XXX.XXX.XXX.XXX आईपी पता है (जाहिर है)।

नोट: एसएसएल सीआरटी और कुंजी स्थान को https अनुरोधों को सही तरीके से पुनर्निर्देशित करने के लिए परिभाषित किया जाना चाहिए

परिवर्तन करने के बाद nginx को पुनरारंभ करना न भूलें:

service nginx restart

भूत ब्लॉग

return 301 $scheme://example.com$request_uri; साथ nginx अनुशंसित विधि बनाने के लिए return 301 $scheme://example.com$request_uri; भूत के साथ काम करने के लिए आपको अपने मुख्य सर्वर ब्लॉक में जोड़ना होगा:

proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    Host                $http_host;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-NginX-Proxy       true;

proxy_pass_header   X-CSRF-TOKEN;
proxy_buffering     off;
proxy_redirect      off;  

अद्वितीय प्रारूप:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}

HTTP समाधान

documentation , "example.org के लिए एक अलग सर्वर को परिभाषित करने का सही तरीका है":

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    ...
}

एचटीटीपीएस समाधान

उन लोगों के लिए जो https:// सहित समाधान चाहते हैं ...

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

नोट: मैंने मूल रूप से https:// को मेरे समाधान में शामिल नहीं किया है क्योंकि हम लोडबैंसर का उपयोग करते हैं और हमारे https: // सर्वर एक उच्च-ट्रैफ़िक SSL भुगतान सर्वर है: हम https: // और http: // मिश्रण नहीं करते हैं।

Nginx संस्करण की जांच करने के लिए, nginx -v उपयोग करें।

Nginx रीडायरेक्ट के साथ यूआरएल से स्ट्रिप www

server {
    server_name  www.domain.com;
    rewrite ^(.*) http://domain.com$1 permanent;
}

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

तो आपको दो सर्वर कोड होना चाहिए।

Nginx रीडायरेक्ट के साथ यूआरएल में www जोड़ें

यदि आपको आवश्यकता है तो डोमेन.com से www.domain.com पर रीडायरेक्ट करने के लिए, आप इसका उपयोग कर सकते हैं:

server {
    server_name  domain.com;
    rewrite ^(.*) http://www.domain.com$1 permanent;
}

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

जैसा कि आप कल्पना कर सकते हैं, यह सिर्फ विपरीत है और पहले उदाहरण के समान काम करता है। इस तरह, आपको एसईओ अंक नीचे नहीं मिलते हैं, क्योंकि यह पूर्ण अनुमति रीडायरेक्ट और स्थानांतरित होता है। कोई डब्ल्यूडब्ल्यूडब्ल्यू मजबूर नहीं है और निर्देशिका दिखाया गया है!

मेरे कुछ कोड बेहतर दृश्य के लिए नीचे दिखाए गए हैं:

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com$1 permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}

यहां कई www से नो-www सर्वर नामों के लिए इसे कैसे किया जाए (मैंने इसे सबडोमेन के लिए उपयोग किया):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}

if ($host ~* ^www.example.com$) {
    return 301 $scheme://example.com$request_uri;
}

यह समाधान मेरे व्यक्तिगत अनुभव से आता है। हमने एस 3 "होस्ट" हेडर पॉलिसी से मेल खाने के लिए non-www से www डोमेन नामों को पुनर्निर्देशित करने के लिए कई अमेज़ॅन एस 3 बाल्टी और एक सर्वर का उपयोग किया।

मैंने nginx सर्वर के लिए निम्न कॉन्फ़िगरेशन का उपयोग किया:

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

यह उन सभी डोमेन नामों से मेल खाता है जो www. साथ शुरू होने वाले सर्वर से इंगित करते हैं www. और www.<domain> रीडायरेक्ट करता है। इसी तरह आप www से non-www www तक विपरीत रीडायरेक्ट कर सकते हैं।


सुनिश्चित नहीं है कि अगर कोई नोटिस करता है कि यह 301 वापस करने के लिए सही हो सकता है लेकिन ब्राउज़र इसे करने के लिए चकित करता है

rewrite ^(.*)$ https://yoursite.com$1; 

से तेज है:

return 301 $scheme://yoursite.com$request_uri;

location / { 
    if ($http_host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; 
    } 
}




no-www