NGINX में एक url को पुनर्निर्देशित कैसे करें


135

मुझे http://www.test.com पर प्रत्येक http://test.com अनुरोध को पुनर्निर्देशित करने की आवश्यकता है । यह कैसे किया जा सकता है।

सर्वर ब्लॉक में मैंने जोड़ने की कोशिश की

 rewrite ^/(.*) http://www.test.com/$1 permanent;

लेकिन ब्राउज़र में यह कहता है

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

मेरा सर्वर ब्लॉक जैसा दिखता है

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

आधिकारिक दस्तावेज पर है: nginx.org/en/docs/http/converting_rewrite_rules.html
मार्सेलो Nuccio

जवाबों:


274

सबसे अच्छा तरीका है कि आप जो चाहते हैं वह एक और सर्वर ब्लॉक जोड़ना है:

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

और अपने मुख्य सर्वर ब्लॉक server_name चर को निम्नानुसार संपादित करें:

server_name  www.test.com;

महत्वपूर्ण : नया serverब्लॉक ऐसा करने का सही तरीका है, ifबुराई हैifयदि संभव हो तो इसके स्थान पर आपको स्थानों और सर्वरों का उपयोग करना चाहिए । Rewriteकभी-कभी बुराई भी होती है , इसलिए इसे बदल दिया return


19
आप return 301 http://wwww.test.com$request_uri;फिर से लिखने के बजाय उस सर्वर ब्लॉक को भी समाप्त कर सकते हैं ।
RCCola

6
returnइसके बजाय प्रयोग पर ditto @RCCola rewriteडॉक्स
अक्टूबर को जेकटन

प्रश्न, कैसे सर्वर ब्लॉक का आदेश दिया जाना चाहिए? redirectतो main serverब्लॉक या main serverब्लॉक तो redirect? क्योंकि मुझे एक ही समस्या है, stackoverflow.com/questions/35451929/…
jhnferraris

उल्लेखित प्रश्न में Nginx विन्यास सही है, आदेश कोई फर्क नहीं पड़ता।
दिमित्री वेरहोत्रोव

4
बस एक त्वरित चेतावनी: 301रीडायरेक्ट बनाम के लिए बाहर देखो 302। आप एक कैश्ड स्थायी पुनर्निर्देशन के साथ फंस सकते हैं, जो पहले से ही एक URL तक पहुंच चुके ग्राहकों के लिए अपनी सेटिंग्स को बदलने के लिए बहुत परेशान करता है। (मुझे पता है कि ओपी ने एक के लिए कहा 301, लेकिन सुनिश्चित करें कि वास्तव में आप क्या चाहते हैं।)
निक मैरिल

16

यहाँ एक अन्य उत्तर के समान है, लेकिन फिर से http को $ स्कीम में बदलें जैसे:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

और अपने मुख्य सर्वर ब्लॉक server_name चर को निम्नानुसार संपादित करें:

server_name  www.test.com;

मुझे www.test.com को test.com पर पुनर्निर्देशित करने के लिए ऐसा करना पड़ा।


9

पहले सुनिश्चित करें कि आपने HTTP पुनर्लेखन मॉड्यूल के साथ Nginx स्थापित किया है। इसे स्थापित करने के लिए हमें pcre-Library की आवश्यकता है

Pcre पुस्तकालय स्थापित करने के लिए कैसे

यदि उपर्युक्त उल्लेख किया गया है या यदि आपके पास पहले से ही है, तो नीचे दिए गए कोड को अपने nginx सर्वर ब्लॉक में जोड़ें

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

Www का उपयोग हर अनुरोध से हटाने के लिए करें

  if ($host = 'www.your_domain.com' ) {
   rewrite  ^/(.*)$  http://your_domain.com/$1  permanent;
  }

तो आपका सर्वर ब्लॉक दिखेगा

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

3

यह "नगीनेक्स रीडायरेक्ट" के लिए Google पर शीर्ष हिट है। यदि आप यहाँ एक ही स्थान को पुनर्निर्देशित करना चाहते हैं:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.