我在使用nginx配置站点时遇到麻烦。
首先配置使用通配符server_name :
server {
listen 80;
listen [::]:80;
server_name _;
return 444;
server_name *.domain.tld;
return 301 https://$host$request_uri;
}
第二次使用 regex 服务器名称来反向代理:
server {
listen 80;
listen [::]:80;
server_name ~^www(?<port>\d{4,5}+)\.sub\.domain\.tld$;
location / {
proxy_pass http://127.0.0.1:$port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
但是当我连接到站点http://www11111.sub.domain.tld时,服务器返回444 。好像nginx对此请求使用配置1。 我在哪里错?,您能解释或解决吗? 对不起,我的英语不好。
答案 0 :(得分:1)
您的通配符服务器名称将始终比您的正则表达式服务器名称优先。您可以尝试以下配置:
server {
listen 80;
listen [::]:80;
server_name "~^www(?<port>\d{4,5}+)\.sub\.domain\.com$";
location / {
proxy_pass http://127.0.0.1:$port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
server {
listen 80;
listen [::]:80;
# using negative regex assertion with the server_name directive
server_name "~^(?!www\d{4,5}\.\sub\.).*\.domain\.com$";
return 301 https://$host$request_uri;
}
server {
listen 80;
listen [::]:80;
# catch all other host names
server_name _;
return 444;
}
如果您要像处理其他domain.com
主机名一样,可以将server_name "~^(?!www\d{4,5}\.\sub\.).*\.domain\.com$";
替换为server_name "~^(?!www\d{4,5}\.\sub\.)(?:.*\.)?domain\.com$";
。