Nginx 重定向到错误的站点;格式不正确的 server_name 指令
Nginx redirecting to the wrong site; poorly formed server_name directive
问题
当您在浏览器的地址栏中键入 example.com
时 没有 输入方案,即 http://
或 https://
,Nginx 重定向用户 https://api.example.com
而不是预期的 https://example.com
。我很确定我的 Nginx 配置有问题,但我不确定是什么。
详情
我在同一台服务器上托管两个网站,使用相同的 IP。 DNS 区域文件中的相关位类似于(此处匿名的域和 IP):
example.com. 1800 IN A xxx.xxx.xxx.xxx
www.example.com. 1800 IN CNAME example.com.
api.example.com. 1800 IN CNAME example.com.
我安装了两个 SSL 证书(由 letsencrypt 提供),每个站点一个,两个站点都配置为重定向到 HTTPS。我有两个 vhost 配置文件,每个站点一个,如下所示:
/etc/nginx/sites-available/api
/etc/nginx/sites-available/default
两者都链接到 /etc/nginx/sites-enabled/
。两个配置文件的相关位如下:
# /etc/nginx/sites-available/api
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name api.example.com;
return 301 https://api.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/api-ssl-params.conf; # ssl config info
server_name api.example.com;
# ... the rest of the site config ...
}
和:
# /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 default_server ipv6only=on;
include snippets/ssl-params.conf; # ssl config info
server_name example.com;
# ... the rest of the site config ...
}
我不明白为什么在地址栏中输入 example.com
会重定向到 https://api.example.com
,因为:
- 只是
example.com
没有出现在 api
配置文件中的任何地方
example.com
不应该匹配 server_name
指令 api.example.com
default
中的服务器块被标记为 default_server
所以当输入不明确的域名时,它不应该优先吗?
谢谢!!!
呃。在写问题的过程中想通了。问题是 example.com
没有出现在任何一个侦听端口 80 的站点的 server_name
指令中。 因为这会导致歧义,nginx 选择字母顺序中的第一个站点订单.
我更新了 default
网站的配置文件如下:
# /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com; # <-- CHANGED THIS LINE
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 default_server ipv6only=on;
include snippets/ssl-params.conf; # ssl config info
server_name example.com;
# ... the rest of the site config ...
}
宇宙一切正常。
问题
当您在浏览器的地址栏中键入 example.com
时 没有 输入方案,即 http://
或 https://
,Nginx 重定向用户 https://api.example.com
而不是预期的 https://example.com
。我很确定我的 Nginx 配置有问题,但我不确定是什么。
详情
我在同一台服务器上托管两个网站,使用相同的 IP。 DNS 区域文件中的相关位类似于(此处匿名的域和 IP):
example.com. 1800 IN A xxx.xxx.xxx.xxx
www.example.com. 1800 IN CNAME example.com.
api.example.com. 1800 IN CNAME example.com.
我安装了两个 SSL 证书(由 letsencrypt 提供),每个站点一个,两个站点都配置为重定向到 HTTPS。我有两个 vhost 配置文件,每个站点一个,如下所示:
/etc/nginx/sites-available/api
/etc/nginx/sites-available/default
两者都链接到 /etc/nginx/sites-enabled/
。两个配置文件的相关位如下:
# /etc/nginx/sites-available/api
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name api.example.com;
return 301 https://api.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/api-ssl-params.conf; # ssl config info
server_name api.example.com;
# ... the rest of the site config ...
}
和:
# /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 default_server ipv6only=on;
include snippets/ssl-params.conf; # ssl config info
server_name example.com;
# ... the rest of the site config ...
}
我不明白为什么在地址栏中输入 example.com
会重定向到 https://api.example.com
,因为:
- 只是
example.com
没有出现在api
配置文件中的任何地方 example.com
不应该匹配server_name
指令api.example.com
default
中的服务器块被标记为default_server
所以当输入不明确的域名时,它不应该优先吗?
谢谢!!!
呃。在写问题的过程中想通了。问题是 example.com
没有出现在任何一个侦听端口 80 的站点的 server_name
指令中。 因为这会导致歧义,nginx 选择字母顺序中的第一个站点订单.
我更新了 default
网站的配置文件如下:
# /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com; # <-- CHANGED THIS LINE
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 default_server ipv6only=on;
include snippets/ssl-params.conf; # ssl config info
server_name example.com;
# ... the rest of the site config ...
}
宇宙一切正常。