我有Nginx作为一个上游服务器gunicorn工作。 我正在尝试将网站configuration为使用HTTPS并强制所有HTTP请求使用SSL。
这是我在/etc/nginx/conf.d/site.conf nginxconfiguration:
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时候安装这个configuration文件,然后按照预期返回页面。
但是,当我使用: https://example.com/ : https://example.com/然后浏览器奇怪地redirect到: https: //_/
当我在www.example.com使用该网站的HTTP版本时,也会发生此问题
我怎样才能重写上述configuration,使其正常工作?
您的configuration明确指出,HTTP请求应redirect到https://_/ 。
server_name _; return 301 https://$server_name$request_uri;
因为server_name设置为_ ,所以用于$server_name 。
您应该使用的variables而不是$server_name是$host 。 根据浏览器的要求,这总是有一些明智的select(只要浏览器要求合理)。
理想情况下, server块的server_name _; 除了错误页面之外不应该提供任何其他内容。 相反,你应该有你的实际域名的server块。 这种configuration可防止通过普通IP地址或未在nginx或您的Web应用程序中configuration的主机名无意访问您的服务器。