2009-10-27 44 views
37

tôi thấy Nginx HttpRewriteModule documentation có một ví dụ để viết lại một miền www-tiền tố vào một miền không www-tiền tố:Nginx viết lại phi www-tiền tố miền www-tiền tố miền

if ($host ~* www\.(.*)) { 
    set $host_without_www $1; 
    rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo' 
} 

Làm thế nào tôi có thể làm ngược lại - viết lại tên miền không có www-tiền tố vào tên miền có www-tiền tố? Tôi nghĩ có lẽ tôi có thể làm một cái gì đó như sau nhưng Nginx không thích lồng nhau nếu tuyên bố.

if ($host !~* ^www\.) {      # check if host doesn't start with www. 
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain) 
     set $host_with_www www.$1; 
     rewrite ^(.*)$ http://$host_with_www$1 permanent; 
    } 
} 

Ngoài ra tôi muốn điều này để làm việc cho bất kỳ tên miền mà không nói cho rõ ràng Nginx để viết lại domain1.com -> www.domain1.com, domain2.com -> www.domain2.com vv kể từ khi tôi có một số lượng lớn các tên miền để viết lại.

Trả lời

13

Tôi đoán tôi không thực sự cần câu lệnh "if" bên ngoài vì tôi chỉ kiểm tra các miền có dạng xxx.xxx anyways. Các công trình sau đây cho tôi, mặc dù nó không mạnh mẽ. Hãy cho tôi biết nếu có một giải pháp tốt hơn.

if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) { 
     set $host_with_www www.$1; 
     rewrite ^(.*)$ http://$host_with_www$1 permanent; 
    } 

Chỉnh sửa: Nhập dấu gạch nối vào biểu thức chính quy vì đó là ký tự hợp lệ trong tên máy chủ.

+0

cách sử dụng tính năng này mà không cần? – pahnin

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

Điều này không phù hợp với tôi vì tôi không muốn viết lại tên miền phụ như static.mydomain.com. Có lẽ tôi nên nói rằng trong câu hỏi của tôi. Cảm ơn câu trả lời của bạn. – saltycrane

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

Bạn chỉ có thể để có được hostname hợp lệ vì yêu cầu sẽ không bao giờ làm cho nó vào máy chủ của bạn bằng cách khác, do đó không cần phải xây dựng logic xác nhận của riêng bạn.

57

As noted in the Nginx documentation, you should avoid using the if directive in Nginx where possible, bởi vì ngay sau khi bạn có một if trong cấu hình của bạn máy chủ của bạn cần phải xem xét tất cả yêu cầu duy nhất để quyết định có để phù hợp với if hay không.

Giải pháp tốt hơn sẽ là nhiều chỉ thị của máy chủ.

server { 
     listen 80; 
     server_name website.com; 
     return 301 $scheme://www.website.com$request_uri; 
} 

server { 
     listen 80; 
     server_name www.website.com; 
     ... 
} 

Nếu bạn đang cố gắng phân phối trang web hỗ trợ SSL (HTTPS), bạn có nhiều hơn ba tùy chọn khác nhau.

  1. Thiết lập nhiều địa chỉ IP có mỗi chỉ thị máy chủ lắng nghe trên IP của chính chúng (hoặc các cổng khác nhau nếu đó là tùy chọn cho bạn). Tùy chọn này cần chứng chỉ SSL cho cả website.comwww.website.com, do đó bạn có chứng chỉ thẻ hoang dã, chứng chỉ UNI (nhiều tên miền) hoặc chỉ hai chứng chỉ khác nhau.
  2. Thực hiện ghi đè trong ứng dụng.
  3. Sử dụng chỉ thị if đáng sợ.

There is also an option to use SNI, but I'm not sure this is fully supported as of now.

+0

Mã đơn giản của bạn đã thực hiện thủ thuật. Cảm ơn nhiều! –

+0

Giải pháp này có thêm lợi ích khi gửi lại mã trạng thái phản hồi Vĩnh viễn đã chuyển HTTP 301. Đây là một giải pháp hiệu quả, thanh lịch và dễ đọc. Cảm ơn! – ndmeiri

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