簡體   English   中英

nginx server_name重寫規則的順序

[英]nginx order of server_name rewrite rules

我在玩使用serverserver_name nginx重寫規則。 文檔聽起來聽起來很簡單,而且關於優先順序也很清楚,但是我的行為有些奇怪,想要檢查是否錯過了任何東西。

我正在嘗試將www.domain.com以外的任何其他內容(例如www.domain.netwww.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM