我有 Nginx 与 gunicorn 一起用作上游服务器。我正在尝试将站点配置为使用 HTTPS 并强制所有 HTTP 请求使用 SSL。
这是我的 nginx 配置/etc/nginx/conf.d/site.conf
:
server {
listen 80;
server_name _;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/ssl/nginx/cert_chain.crt;
ssl_certificate_key /etc/ssl/nginx/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000";
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
安装此配置后,每当我去:
https://example.com/page.html
它就会按预期返回页面。
但是当我使用:https://example.com/
然后浏览器奇怪地重定向到:https: //_/
当我使用网站的 HTTP 版本时,也会出现此问题
www.example.com
我该如何重写上述配置以使其正常工作?
答案1
您的配置明确指出 HTTP 请求应该重定向到https://_/
。
server_name _;
return 301 https://$server_name$request_uri;
因为server_name
设置为_
,这就是用于$server_name
。
您应该使用的变量而不是$server_name
is $host
。这将始终根据浏览器的请求获得一些合理的信息(前提是浏览器请求了一些合理的信息)。
不过,理想情况下,server
带有的块server_name _;
不应提供除错误页面之外的任何内容。相反,您应该server
为实际域名设置块。这样的配置可防止通过未在 nginx 或 Web 应用程序中配置的纯 IP 地址或主机名意外访问您的服务器。