วิธีเปลี่ยนเส้นทาง url ใน NGINX


135

ฉันจำเป็นต้องเปลี่ยนเส้นทางทุกhttp://test.comการร้องขอไปยังhttp://www.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
Marcello 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
ditto @RCCola ในการใช้returnแทนrewrite. ดูเอกสาร
JCotton

คำถามควรสั่งบล็อกเซิร์ฟเวอร์อย่างไร? redirectแล้วmain serverบล็อกหรือmain serverบล็อกแล้วredirect? เพราะฉันมีปัญหาเดียวกันstackoverflow.com/questions/35451929/…
jhnferraris

การกำหนดค่า Nginx ในคำถามที่กล่าวถึงถูกต้องลำดับไม่สำคัญ
Dmitry Verhoturov

4
เพียงคำเตือนสั้น ๆ : ระวังการ301เปลี่ยนเส้นทางเทียบกับ302. คุณอาจติดขัดกับการเปลี่ยนเส้นทางถาวรที่แคชไว้ซึ่งทำให้การเปลี่ยนการตั้งค่าสำหรับไคลเอนต์ที่เข้าถึง URL นั้นเป็นเรื่องลำบากมาก (ฉันรู้ว่า OP ขอ301แต่ต้องแน่ใจว่านั่นคือสิ่งที่คุณต้องการจริงๆ)
Nick Merrill

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

ขั้นแรกตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Nginx ด้วยโมดูลเขียนซ้ำ HTTP ในการติดตั้งสิ่งนี้เราจำเป็นต้องมี 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;
            }
    }

4

นี่คือรายการยอดนิยมใน Google สำหรับ "nginx redirect" หากคุณมาที่นี่เพียงแค่ต้องการเปลี่ยนเส้นทางสถานที่เดียว:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

ง่ายและรวดเร็ว :)
Vivek Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.