我正在尝试设置一个强制使用 https 的 Web 服务器。目前,根域(我将其称为 name.com)可以毫无问题地重定向到 https,但子域(my.name.com)却不行。https://my.name.com确实有效。
这是我的配置文件:
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
server {
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name my.name.com www.my.name.com;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_certificate <path to cert>
ssl_certificate_key <path to key>
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
}
我在这里遗漏了什么?
答案1
根据您的配置,这似乎是服务器上的默认站点,如果是这样,请尝试编辑您的第一个服务块如下:
服务器 { 听 80 默认服务器; 听[::]:80默认服务器; 服务器名称 _; 返回 301 https://$host$request_uri; }
您没有将第一个块作为端口 80 的默认服务器,也没有列出任何服务器名称(如果它不是默认服务器,则需要列出),因此可能没有流量击中第一个服务器块。
当某个块被设置为 default_server 时,它会告诉 Nginx 使用该块来处理该块所绑定的端口/IP 地址上的所有请求(在本例中为所有 IP 上的端口 80),这些请求与名称更具体的服务器块不匹配。另一种理解方式是将其视为“全部捕获”块。
当一个块设置了一个或多个特定服务器名称时,该块将仅适用于这些主机名。因此,在您的情况下,第二个服务器块将仅响应 my.name.com 和 www.my.name.com
看本网站有关 SSL 重定向的更多信息和详细信息。