[英]nginx order of server_name rewrite rules
我在玩使用server
和server_name
nginx重寫規則。 該文檔聽起來聽起來很簡單,而且關於優先順序也很清楚,但是我的行為有些奇怪,想要檢查是否錯過了任何東西。
我正在嘗試將www.domain.com
以外的任何其他內容(例如www.domain.net
, www.domain.info
)重定向到www.domain.com
。 除了www.domain.de
,重定向到www.domain.com/de
。
我有以下規則:
server {
server_name domain.de www.domain.de;
rewrite ^(.*) http://www.domain.com/de$1 permanent;
}
server {
server_name _;
rewrite ^(.*) http://www.domain.com$1 permanent;
}
server {
listen 80;
server_name localhost domain.com www.domain.com;
...
}
但是,似乎與此規則集一樣,它將始終將所有非.com
域重定向到www.domain.com/de
。 而如果我翻轉前兩個server
段,則可以正常工作。
難道我做錯了什么? 如果顯式指定服務器名稱,為什么規則順序很重要?
使用server_name _;
表示“這是默認服務器”是一個常見錯誤。 它沒有特殊含義,您需要在listen指令上使用default_server
標志將第二台服務器標記為默認服務器:
server {
listen 80 default_server;
server_name _;
rewrite ^ http://www.domain.com$request_uri? permanent;
}
正確的配置為:
server {
listen 80;
server_name domain.de www.domain.de;
return 301 http://www.domain.com/de$request_uri;
}
server {
listen 80 default_server;
server_name _;
return 301 http://www.domain.com$request_uri;
}
server {
listen 80;
server_name "" localhost domain.com www.domain.com;
...
}
server_name _;
只是一個流行的存根。 server_name偽指令的默認值為“”,它處理沒有“ Host”頭的請求。 如果客戶端根本不發送消息,則server_name ""
將導致像您這樣的配置中的重定向循環。
請看一下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.