2012-04-24 43 views
123

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

Trong khối máy chủ tôi đã cố gắng 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; 
      } 
    } 
+0

Tài liệu chính thức có tại: http://nginx.org/en/docs/http/converting_rewrite_rules.html –

Trả lời

249

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ủ:

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: New server khối là cách đúng để thực hiện việc này, if is evil. Bạn phải sử dụng vị trí và máy chủ thay vì if nếu có thể. Rewrite đôi khi là evil too, vì vậy hãy thay thế bằng return.

+18

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

+5

ditto @RCCola khi sử dụng 'return' thay vì' rewrite'. Xem [tài liệu] (http://wiki.nginx.org/Pitfalls#Taxing_Rewrites) – JCotton

+0

Câu hỏi, các khối máy chủ nên được đặt hàng như thế nào? 'redirect' sau đó là khối' main server' hoặc 'main server' sau đó là' redirect'? Vì tôi có cùng sự cố, http://stackoverflow.com/questions/35451929/nginx-redirecting-non-www-to-www-with-request-uri-does-not-work – Jhn

6

Trước tiên hãy chắc chắn rằng bạn đã cài đặt Nginx với mô-đun viết lại HTTP. Để cài đặt này, chúng ta cần phải có PCRE-thư viện

How to install pcre library

Nếu nói trên được thực hiện hoặc nếu bạn đã có chúng, sau đó chỉ cần thêm đoạn code dưới đây trong khối máy chủ nginx bạn

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

để loại bỏ www từ 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; 
    } 

nên khối máy chủ của bạn sẽ trông giống như

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

Tương tự như một câu trả lời ở đây, nhưng thay đổi http trong viết lại để đến $ chương trình như sau:

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.

Các vấn đề liên quan