2012-07-04 22 views
22

Tôi có mảnh cấu hình nginx sau:Nginx Di WWW và ứng phó với Cả

server { 
    listen 80; 

    server_name mydomain.io; 

    root /srv/www/domains/mydomain.io; 

    index index.html index.php; 

    access_log /var/log/nginx/domains/mydomain.io/access.log; 
    error_log /var/log/nginx/domains/mydomain.io/error.log; 

    location ~\.php { 
     try_files $uri =404; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_intercept_errors on; 
     fastcgi_pass 127.0.0.1:9000; 
     include /etc/nginx/fastcgi_params; 
    } 
} 

Thứ nhất, làm thế nào tôi có thể làm cho phản ứng khối máy chủ để bothhttp://www.mydomain.io và cũng http://mydomain.io. Thứ hai, tôi muốn ép buộc nếu chúng đến từ http://www.mydomain.io để chuyển hướng đến http://mydomain.io.

Cảm ơn.

Trả lời

-17

Về câu hỏi đầu tiên - chỉ cần thêm cả hai lĩnh vực:

server_name mydomain.io www.mydomain.io; 

Đối với thứ hai, bạn sẽ cần phải chuyển hướng đơn giản này:

server { 
     listen 80; 

     server_name www.mydomain.io mydomain.io; 

     if ($host = 'www.mydomain.io') { 
     rewrite ^/(.*)$ http://mydomain.io/$1 permanent; 
     } 
+5

Sử dụng nếu trong cấu hình nginx không được khuyên dùng: http://wiki.nginx.org/IfIsEvil. Thay vì sử dụng hai khối máy chủ theo đề xuất của @Gerry – Jrgns

+3

@Jrgns: Ngoài ra, 'viết lại' được đề cập là một trong hai" 100% điều an toàn có thể được thực hiện bên trong nếu trong bối cảnh vị trí "trong nginx wiki ... – Tisho

+2

Nếu điều này có đủ số phiếu giảm giá mà giá trị của nó là âm sẽ hệ thống vẫn giữ nguyên nó như là câu trả lời đã chọn? – Bryson

13

Tôi tin rằng nó tốt hơn để thêm hai khối máy chủ riêng biệt để tránh việc kiểm tra không cần thiết theo khối if. Tôi cũng sử dụng biến $ scheme để các yêu cầu HTTPS sẽ không được chuyển hướng đến các đối tác không an toàn của chúng.

server { 
    listen 80; 

    server_name www.mydomain.io; 

    rewrite^$scheme://mydomain.io$uri permanent; 
} 

server { 
    listen 80; 

    server_name mydomain.io; 

    # your normal server block definitions here 
} 
+3

Tôi đã bỏ phiếu này do nhầm lẫn, nhưng nó cũng là một câu trả lời sai. Việc sử dụng 'viết lại' theo cách này được khuyến khích bởi chính tài liệu NGINX. Xin vui lòng xem câu trả lời của Ryan về việc sử dụng thích hợp 'return 301 $ scheme: //domain.com$request_uri;' – Bryson

137

Theo https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, bạn nên sử dụng:

server { 
    server_name www.example.com; 
    return 301 $scheme://example.com$request_uri; 
} 
server { 
    server_name example.com; 
    # [...] 
} 
+20

Vui lòng upvote điều này, mọi người. Nó làm cho tôi buồn khi thấy câu trả lời phù hợp nhất được chấp nhận, thứ hai tốt nhất với đa số phiếu bầu ... trong khi đó câu trả lời đúng sẽ yếu đi. Câu trả lời của Gerry là tốt hơn so với Tisho, tuy nhiên câu trả lời của Ryan ở đây là cách được khuyên dùng. Hãy suy nghĩ về nó. Bạn có muốn máy chủ trả lời hai yêu cầu cho mọi yêu cầu mà nó gửi tới www không? Không, không, không. – Charlesism

+2

Hoàn toàn đồng ý !! – Bazinga777

+0

Tôi đang sử dụng một khối tổng quát hơn xử lý máy chủ cục bộ của tôi (localhost). Thật không may, điều này có nghĩa là trong sản xuất 'www.' không bị giảm xuống.làm thế nào tôi có thể cải thiện khối này? (xin lỗi vì đã định dạng kém) máy chủ { nghe 80; server_name ~^(www | app) \. (. *) $; trả lại 301 $ scheme: // $ 1 $ request_uri; } – robinnnnn

2

Một cách khác để mã hóa nó:

if ($http_host ~* "^www\.(.+)$"){ 
    rewrite ^(.*)$ http://%1$request_uri redirect; 
} 

Nó hoạt động ngay cả với nhiều tên miền trên cùng một mã.

-1
server { 
    listen 80; 
    server_name www.mydomain.io; 
    return 301 https://$host$request_uri; 
} 

server { 
    listen 80; 
    server_name mydomain.io; 
    ... 
} 
+0

Biến $ host trong khối máy chủ đầu tiên có giá trị "www.mydomain.io". Vì vậy, bạn chuyển hướng yêu cầu từ http: // www.mydomain.io sang https: // www.mydomain.io nhưng không yêu cầu mydomain.io theo yêu cầu –

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