[英]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.