我有一台服务器,将托管许多网站,但现在只有两个。site1 (http://site1.com) 是 http 并且 site2 (https://site2.com) 是 https。这两个站点都是基于 node.js 并运行不同的端口,我使用 nginx 的 proxy_pass 将域路由到端口。
我现在遇到的问题是你可以导航到https://site1.com但它会加载 site2 的网站https://site1.com。显然这并不好,因为 google 已经在错误的域名下对 https 页面进行了索引。
我还不太熟悉 nginx,但我当前的配置肯定是将所有 https 流量路由到此端口。将来我会有多个 https 和 http 站点,显然所有流量都需要正确路由。
有人能看看我的配置并告诉我我做错了什么吗?
我的 nginx.conf 文件是默认的
这是我的http://site1.com配置
server
{
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
location /
{
proxy_pass http://127.0.0.1:3103;
include /etc/nginx/proxy_params;
}
}
这是我的https://site2.com配置
server {
listen 80;
listen [::]:80;
server_name site2.com www.site2.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name site2.com;
ssl_certificate /etc/nginx/ssl/site2_com.crt;
ssl_certificate_key /etc/nginx/ssl/site2_com.key;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass "http://127.0.0.1:3101";
# rewrite redirects to http as to https
proxy_redirect http:// https://;
}
}
欢迎提出任何建议和问题!如果您需要更多信息,请告诉我。谢谢!
答案1
Nginx 始终有一个默认服务器,用于处理server_name
不匹配的请求。如果您未使用属性明确指定一个服务器default_server
,它将选择具有匹配指令的第一个服务器listen
。
在您的情况下,server
site2 的块用于处理任何https
连接,尽管带有无效证书警告。
您可以定义一个“捕获全部”server
块,以便server_name
必须与每个合法server
块匹配。
例如:
server {
listen 80 default_server;
listen 443 ssl default_server;
return 444;
}
它可以很好地进行http
连接。但是,https
连接总是有问题的,因为您不能指望每个指向您服务器的虚假域名都有有效的证书。这至少可以防止错误的服务器块处理请求。
看这个文件了解详情。