Nginx no-www से www और www से no-www


497

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

मैं www.mysite.com चाहता हूं कि mysite.com पर जाऊं। SEO और अन्य कारणों से।

मेरा /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

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


1
मुझे यह टिप्पणी करने के लिए मजबूर होना Dashboard > Settings > General Settingsपड़ता है कि यदि आप एक वर्डप्रेस वेबसाइट के साथ काम कर रहे हैं, तो यह जांचें और सुनिश्चित करें कि wwwवर्डप्रेस एड्रेस / साइट एड्रेस साइट में कोई भी नहीं है। कोई फर्क नहीं पड़ता कि आप अपने nginx को कैसे कॉन्फ़िगर करते हैं, यदि आपके पास इन URL में www है तो यह उस में www के साथ पुनर्निर्देशित हो जाएगा।
अभिनव सूद

जवाबों:


792

HTTP सॉल्यूशन

से प्रलेखन , "सही तरीके से 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 Solution

उन लोगों के लिए जो समाधान सहित 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 का उपयोग करते हैं: // सर्वर एक उच्च-ट्रैफ़िक एसएसएल भुगतान सर्वर है: हम https: // और http: // को नहीं मिलाते हैं।


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

Nginx रीडायरेक्ट के साथ url से 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#
}

इसलिए आपको TWO सर्वर कोड की आवश्यकता होगी।

Nginx रीडायरेक्ट के साथ url में www जोड़ें

अगर आपको जो चाहिए, वह विपरीत है, तो domain.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#
}

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

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

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;
       }
}

3
@ पुक इसकी सराहना करता है। Nginx अद्भुत है, लेकिन अच्छा प्रलेखन जो सर्वर संस्करण और OS और सर्वर हार्डवेयर परिवर्तनों के साथ अद्यतित रहता है, काफी थकाऊ है। सबसे अच्छा संसाधन जो मुझे सेवा देता है वह है Howtoforge.com क्योंकि यह रैकस्पेस क्लाउड संस्करणों का समर्थन करता है। ऊपर दिए गए कुछ आदेश बाद के संस्करणों में काम नहीं करेंगे। लेकिन यह nginx / 0.8.54 - मेरा विश्वास है, सबसे अच्छा nginx सर्वर) को अपग्रेड या अपडेट करने की कोई आवश्यकता नहीं है। ठीक काम करता है। प्रति दिन 4200 लेनदेन औसत के साथ 100,000 अद्वितीय हिट। Nginx RAPID है। जैसे बिना ट्रैफ़िक वाली साइट का उपयोग करना।
TheBlackBenzKid

17
आपके पुनर्लेखन को रिटर्न बनना चाहिए, जैसे कि return 301 $scheme://domain.com$request_uri;। किसी भी पैटर्न पर कब्जा करने की आवश्यकता नहीं है,
रॉबर्टो

4
@ TheBlackBenzKid क्षमा करें, शायद मैंने कुछ याद किया है, लेकिन अद्यतन समाधान काम नहीं कर रहा है। यह इसलिए है क्योंकि 80 सुनो - इसके साथ, आप कह रहे हैं कि केवल HTTP यह मेल खा रहा है। यह सुनने के लिए अधिक पोर्ट होना चाहिए कि क्या HTTP और HTTPS के लिए समान कॉन्फ़िगरेशन का उपयोग किया जाता है ... या? लेकिन निश्चितता ने मेरी मदद की, +1। जवाब के लिए धन्यवाद। चीयर्स।
Tomis

3
@ TheBlackBenzKid यह सिर्फ नोट था। मुझे काम करने का हल मिल गया है। आपके उदाहरण में, केवल सुनो 443 को जोड़ा जाना चाहिए और पूर्ण कार्य करना चाहिए।
Tomis

2
उत्तर गलत है। यह सभी उप डोमेन को www पर पुनर्निर्देशित करता है।
r3wt

398

वास्तव में आपको फिर से लिखने की जरूरत नहीं है।

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(जो कि किसी नगनेक्स संस्करण में उपलब्ध होना चाहिए) तो यह सीधे निष्पादन को रोक देता है। यह किसी भी संदर्भ में पसंद किया जाता है।

गैर-एसएसएल और एसएसएल दोनों को अपने गैर-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 कीवर्ड। चर का उपयोग नहीं करने से आपको कोई प्रदर्शन प्राप्त नहीं होगा।

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

एसएसएल (IPv4, IPv6, SPDY, ...) के साथ UNIX पर व्यक्तिगत कॉन्फ़िगरेशन को पुनर्निर्देशित करें:

#
# 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...
}

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

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


3
यदि आप HSTS का उपयोग कर रहे हैं तो आपका Chrome आपके लिए www डोमेन पर जाने में सक्षम नहीं होना चाहिए । कृपया अधिक से अधिक विवरण के साथ एक नया प्रश्न खोलें और मैं आपकी मदद करूंगा (आप URL को यहां टिप्पणी के रूप में पोस्ट कर सकते हैं)।
फ्लेशग्राइंडर

1
@Fleshgrinder मैं आपके सेटअप को लागू करने की कोशिश कर रहा हूं, लेकिन निम्नलिखित मुद्दे पर stackoverflow.com/questions/29451409/… इस काम को करने के बारे में कोई विचार?
YPCrumble

4
दूसरे खंड में "नॉन-एसएसएल और एसएसएल दोनों को उनके गैर-www समकक्ष में पुनर्निर्देशित करें:", दोनों सर्वर ब्लॉकों में एसएसएल निर्देश होना चाहिए, क्योंकि उदाहरण के लिए रीडायरेक्ट करने से पहले ब्राउज़र को www.example.com के लिए प्रमाणपत्र को सत्यापित करना होगा। .com।
जेफ त्से

1
बेशक, मैंने इसे जोड़ा और साथ ही साथ एचएसटीएस के बारे में एक छोटी जानकारी भी दी।
फ्लेशग्रिंडर

1
@YPCrumble हाँ, यह इस तरह से तेज़ है क्योंकि हम प्रत्येक अनुरोध पर नियमित अभिव्यक्ति का मिलान नहीं कर रहे हैं। हम केवल रीडायरेक्ट करते हैं यदि हम जानते हैं कि हमें रीडायरेक्ट करना है। कोई जांच नहीं, कोई मान्यता नहीं, कुछ भी नहीं: बस पुनर्निर्देशित। =)
फ्लेशग्रैंडर

37

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

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

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

7
मुझे समर्पित सर्वर ब्लॉक से बेहतर यह तरीका पसंद है। बदलें httpकरने के लिए$scheme
ck_

2
बहुत बेहतर है, विश्वास नहीं कर सकता कि इस कार्य के लिए कई हार्डकोड डोमेन को कॉन्फ़िगर करेंगे।
MrYellow

1
@ वह लिंक (आज के अनुसार) प्रदर्शन का उल्लेख नहीं करता है, बल्कि यह कि वे 100% सुरक्षित नहीं हैं। यह कहता है "केवल 100% सुरक्षित चीजें जो किसी स्थान के संदर्भ में अंदर की जा सकती हैं: return ...और rewrite ... last"। प्रदर्शन के मुद्दों के लिए कोई अद्यतन लिंक?
एडम

1
यह मेरे लिए काम नहीं किया। अवैध प्रतिक्रिया कहने वाले ब्राउज़र पर एक त्रुटि हो रही है।
निको ब्रेनर

1
दुर्भाग्य से, मुझे "अगर" के बिना कोई रास्ता नहीं मिला। मैं कई डोमेन के लिए एक ही कॉन्फ़िगरेशन का उपयोग करता हूं, डोमेन नामों को हार्डकोड करना एक विकल्प नहीं है। किसी भी सुझाव / टिप्पणी की सराहना की है!
मार्टिन होगर

27

आपको दो सर्वर ब्लॉक चाहिए।

इन्हें अपनी कॉन्फिग फाइल में डालें जैसे /etc/nginx/sites-available/sitename

मान लीजिए कि आपने http://example.com को उपयोग करने के लिए मुख्य पते के रूप में तय किया है ।

आपकी कॉन्फ़िग फ़ाइल इस तरह दिखनी चाहिए:

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

        # this is the main server block
        # insert ALL other config or settings in this server block
}

पहला सर्वर ब्लॉक 'www' उपसर्ग के साथ किसी भी अनुरोध को पुनर्निर्देशित करने के निर्देश रखेगा। यह URL के लिए 'www' उपसर्ग और पुनर्निर्देशन के अनुरोधों को सुनता है।

यह और कुछ नहीं करता है।

दूसरा सर्वर ब्लॉक आपका मुख्य पता रखेगा - वह URL जिसका आप उपयोग करना चाहते हैं। अन्य सभी सेटिंग्स यहाँ की तरह जाना root, index, location, आदि इन अन्य सेटिंग्स आप सर्वर ब्लॉक में शामिल कर सकते हैं के लिए डिफ़ॉल्ट फ़ाइल की जाँच करें।

सर्वर को दो DNS A रिकॉर्ड की आवश्यकता होती है।

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

IPv6 के लिए AAAA रिकॉर्ड की जोड़ी को अपने ipv6- पते का उपयोग करके बनाएँ।


23

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

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

20
  1. सर्वोत्तम अभ्यास: अलग serverw / हार्डकोडserver_name

नगीनक्स के साथ सबसे अच्छा अभ्यास serverइस तरह एक रीडायरेक्ट के लिए एक अलग का उपयोग करना है ( serverअपने मुख्य कॉन्फ़िगरेशन के साथ साझा नहीं किया गया है), सब कुछ हार्डकोड करने के लिए, और बिल्कुल भी नियमित अभिव्यक्ति का उपयोग न करें।

यदि आप HTTPS का उपयोग कर रहे हैं तो डोमेन को हार्डकोड करना भी आवश्यक हो सकता है, क्योंकि आपको यह जानना होगा कि आप कौन से प्रमाणपत्र प्रदान कर रहे हैं।

server {
    server_name www.example.com;
    return  301 $scheme://example.com$request_uri;
}
server {
    server_name www.example.org;
    return  301 $scheme://example.org$request_uri;
}
server {
    server_name example.com example.org;
    # real configuration goes here
}

  1. के भीतर नियमित भाव का उपयोग करना server_name

यदि आपके पास कई साइटें हैं, और सबसे अंतिम प्रदर्शन की परवाह नहीं करते हैं, लेकिन चाहते हैं कि उनमें से हर एक www.उपसर्ग के संबंध में समान नीति रखे, तो आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं। एक अलग का उपयोग करने का सबसे अच्छा अभ्यास serverअभी भी खड़ा होगा।

ध्यान दें कि यदि आप https का उपयोग करते हैं तो यह समाधान मुश्किल हो जाता है, क्योंकि आपके पास अपने सभी डोमेन नामों को कवर करने के लिए एक एकल प्रमाणपत्र होना चाहिए यदि आप चाहते हैं कि यह ठीक से काम करे।


सभी साइटों के लिए एक समर्पित एकल में गैर- wwwसे wwww / regex server:

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

wwwसभी साइटों के लिए wwwएक समर्पित एकल में गैर- w / regex के serverलिए:

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

wwwwwwसमर्पित में गैर- w / regex कोserverकेवल कुछ साइटों के लिए :

केवल दो-दो डोमेन को कवर करने के लिए रेगेक्स को प्रतिबंधित करना आवश्यक हो सकता है, फिर आप केवल मैच के लिए कुछ इस तरह का उपयोग कर सकते हैं www.example.org; www.example.comऔर www.subdomain.example.net:

server {
    server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
    return  301 $scheme://$domain$request_uri;
}

नियमित एक्सप्रेशन w / nginx का परीक्षण करना

आप परीक्षण कर सकते हैं कि रेगेक्स pcretestआपके सिस्टम पर अपेक्षित रूप से काम करता है, जो कि ठीक उसी pcreलाइब्रेरी है जिसे आपका नग्नेक्स नियमित अभिव्यक्ति के लिए उपयोग कर रहा होगा:

% pcretest 
PCRE version 8.35 2014-04-04

  re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$#
data> test
No match
data> www.example.org
 0: www.example.org
 1: example.org
data> www.test.example.org
No match
data> www.example.com
 0: www.example.com
 1: example.com
data> www.subdomain.example.net
 0: www.subdomain.example.net
 1: subdomain.example.net
data> subdomain.example.net
No match
data> www.subdomain.example.net.
No match
data> 

ध्यान दें कि आपको डॉटिंग या केस के बारे में चिंता करने की कोई आवश्यकता नहीं है, क्योंकि nginx सर्वर नाम regex के अनुसार nginx पहले से ही इसका ख्याल रखता है, जब "Host" हेडर में ट्रेलिंग डॉट होता है


  1. ifमौजूदा server/ HTTPS के भीतर छिड़के :

इस अंतिम समाधान को आमतौर पर सबसे अच्छा अभ्यास नहीं माना जाता है, हालांकि, यह अभी भी काम करता है और काम करता है।

वास्तव में, यदि आप HTTPS का उपयोग कर रहे हैं, तो यह अंतिम समाधान बनाए रखने में आसान हो सकता है, क्योंकि आपको अलग-अलग serverपरिभाषाओं के बीच ssl निर्देशों का एक पूरा गुच्छा कॉपी-पेस्ट नहीं करना होगा , और इसके बजाय केवल स्निपेट को ही जगह दे सकता है आवश्यक सर्वर, इसे डीबग करना और अपनी साइट्स को बनाए रखना आसान है।


गैर wwwसे www:

if ($host ~ ^(?!www\.)(?<domain>.+)$) {
    return  301 $scheme://www.$domain$request_uri;
}

wwwगैर- www:

if ($host ~ ^www\.(?<domain>.+)$) {
    return  301 $scheme://$domain$request_uri;
}

हार्डकोडिंग एक एकल पसंदीदा डोमेन

यदि आप थोड़ा और अधिक प्रदर्शन चाहते हैं, साथ ही कई डोमेन के बीच एक एकल serverका उपयोग कर सकते हैं, तो यह अभी भी एक ही पसंदीदा डोमेन को स्पष्ट रूप से हार्डकोड करने के लिए समझ में आ सकता है:

if ($host != "example.com") {
    return  301 $scheme://example.com$request_uri;
}

संदर्भ:


16

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

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

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

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


https के बारे में क्या? नोट: https प्रमाण पत्र की जरूरत है
Toskan

यहाँ HTTPS के साथ कोई समस्या नहीं है। listen 80आप listen 443 sslऔर फिर ssl_certificateऔर ssl_certificate_keyनिर्देशों को जोड़ने की जरूरत के बाद ।
VisioN

आजकल कोई भी http का उपयोग नहीं करता है। मैं Google में एक शीर्ष सूचीबद्ध मार्गदर्शिका पढ़ रहा था जिसने listen 443 ssl गायब सर्टिफिकेट के साथ सिर्फ एक उदाहरण दिया । यही कारण है कि अभ्यस्त काम करते हैं और कुछ गंभीर सिर दर्द पैदा कर रही है।
तोस्कान

मैं नहीं जानता कि आप किस गाइड की बात कर रहे हैं। मेरे पास लगभग तीन वर्षों से यह कॉन्फ़िगरेशन सफलतापूर्वक काम कर रहा है। पिछले साल मैंने एसएसएल के लिए समर्थन जोड़ा था और यह उम्मीद के मुताबिक काम करता है। और निश्चित रूप से आपको हाथ में एक निजी कुंजी के साथ एक प्रमाण पत्र होना चाहिए।
20

तो यह www, को छोड़कर सभी सबडोमेन को क्लोब करेगा?
पैराग्राफर

15

मैंने हार्ड कोडित डोमेन के बिना सभी सरल उत्तरों में से सर्वश्रेष्ठ को संयोजित किया।

गैर-www से www (HTTP या HTTPS) तक 301 स्थायी पुनर्निर्देशन:

server {
    if ($host !~ ^www\.) {
        rewrite ^ $scheme://www.$host$request_uri permanent;
    }

    # Regular location configs...
}

यदि आप गैर-HTTPS, गैर-www से HTTPS, www को एक ही समय में पुनर्निर्देशित करना पसंद करते हैं:

server {
    listen 80;

    if ($host !~ ^www\.) {
        rewrite ^ https://www.$host$request_uri permanent;
    }

    rewrite ^ https://$host$request_uri permanent;
}

11

गैर-www को www पर पुनर्निर्देशित करें

एकल डोमेन के लिए:

server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}

सभी डोमेन के लिए:

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}

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

server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

सभी डोमेन के लिए:

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

क्या आप 80और के बीच अंतर प्रदान कर सकते हैं 443?
हसन बेग

1
यह listenमेरे लिए निर्देश के बिना काम करने लगता है (nginx 1.4.6)।
इब्राहिम

11

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

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

अन्य तरीका: Nginx no-www से www

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

और www से no-www

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

लेखकों ने nginx में एक if-statement क्यों प्रदान किया और फिर लोगों को इससे बचने के लिए कहा? लगता है मेरे लिए flippant।
ग्रेग स्मिटेल्स

4
वहाँ कहा गया है "यदि स्थान बुरा है"। आप सुरक्षित रूप से डाल सकते हैं अगर आपके सर्वर ब्लॉक में
कुकुनिन

उपरोक्त लिंक से प्रत्यक्ष उद्धरण ... केवल 100% सुरक्षित चीजें जो स्थान के संदर्भ में अंदर की जा सकती हैं: वापसी ...; फिर से लिखना ... आखिरी;
जस्टिन ई

8

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

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

1
आप इसे इस प्रकार लिखकर सामान्य बना सकते हैं: server { server_name "~^www\.(.*)$" ; return 301 $scheme://$1$request_uri ; }
रामस्त


3

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

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

इससे तेज है:

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


1
मेरी टिप्पणी को ब्राउज़र को निर्देश दिया गया था कि वह नग्नेक्स की तरफ दक्षता न करे! एक रीडायरेक्ट के साथ ब्राउज़र जब rewiting 2 अनुरोध बनाम 1 अनुरोध करता है
स्टीवन

2

भूत ब्लॉग

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

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;  

2

यदि आप डोमेन नाम को हार्डकोड नहीं करना चाहते हैं, तो आप इस रीडायरेक्ट ब्लॉक का उपयोग कर सकते हैं। अग्रणी www के बिना डोमेन को चर के रूप में सहेजा जाता है $domainजिसे पुनर्निर्देशित कथन में पुन: उपयोग किया जा सकता है।

server {
    ...
    # Redirect www to non-www
    if ( $host ~ ^www\.(?<domain>.+) ) {
       rewrite ^/(.*)$ $scheme://$domain/$1;
    }
}

आरईएफ: नग्नेक्स में एक नियमित अभिव्यक्ति के साथ एक उपडोमेन को पुनर्निर्देशित करना



-6

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

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 IP पता (जाहिर है) है।

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

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

service nginx restart

3
/etc/init.d/nginx reloadआप reloadसर्वर भी कर सकते हैं जो किसी भी डाउनटाइम का कारण नहीं बनता है।
TheBlackBenzKid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.