Cách chuyển hướng một url trong NGINX


135

Tôi cần chuyển hướng mọi yêu cầu http://test.com đến http://www.test.com . Điều này có thể giải quyết như thế nào.

Trong khối máy chủ, tôi đã thử thêm

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

nhưng trong trình duyệt nó nói

  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.

khối máy chủ của tôi trông giống như

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

Câu trả lời:


274

Cách tốt nhất để làm những gì bạn muốn là thêm một khối máy chủ khác:

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

Và chỉnh sửa biến server_name khối máy chủ chính của bạn như sau:

server_name  www.test.com;

Quan trọng : serverKhối mới là cách đúng đắn để làm điều này, iflà xấu xa . Bạn phải sử dụng vị trí và máy chủ thay vì ifnếu có thể. Rewriteđôi khi là xấu xa , vì vậy thay thế nó bằng return.


19
Bạn cũng có thể kết thúc khối máy chủ return 301 http://wwww.test.com$request_uri;đó thay vì viết lại.
RCCola

6
ditto @RCCola sử dụng returnthay vì rewrite. Xem tài liệu
JC Bông

Câu hỏi, các khối máy chủ nên được đặt hàng như thế nào? Thế redirectthì main serverkhối hay main serverkhối thì redirectsao? Bởi vì tôi có cùng một vấn đề, stackoverflow.com/questions353451929/ từ
jhnferraris 17/2/2016

Nginx config trong câu hỏi được đề cập là chính xác, thứ tự không quan trọng.
Dmitry Verhoturov

4
Chỉ cần một cảnh báo nhanh: Coi chừng 301chuyển hướng so với 302. Bạn có thể bị mắc kẹt với một chuyển hướng vĩnh viễn được lưu trong bộ nhớ cache, điều này gây khó khăn cho việc thay đổi cài đặt của bạn cho các khách hàng đã truy cập URL. (Tôi biết OP đã yêu cầu a 301, nhưng hãy chắc chắn đó thực sự là những gì bạn muốn.)
Nick Merrill

16

Tương tự như một câu trả lời khác ở đây, nhưng thay đổi http trong viết lại thành lược đồ $ như vậy:

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

Và chỉnh sửa biến server_name khối máy chủ chính của bạn như sau:

server_name  www.test.com;

Tôi đã phải làm điều này để chuyển hướng www.test.com đến test.com.


9

Trước tiên, hãy đảm bảo bạn đã cài đặt Nginx với mô đun viết lại HTTP. Để cài đặt cái này, chúng ta cần có pcre-library

Cách cài đặt thư viện pcre

Nếu các đề cập ở trên được thực hiện hoặc nếu bạn đã có chúng, thì chỉ cần thêm mã dưới đây vào khối máy chủ nginx của bạn

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

Để xóa www khỏi mọi yêu cầu bạn có thể sử dụng

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

vì vậy khối máy chủ của bạn sẽ trông như thế nào

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

2

Đây là hit hàng đầu trên Google cho "nginx redirect". Nếu bạn đến đây chỉ muốn chuyển hướng một vị trí:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.