我在子域上有多个站点,我尝试使用nginx提供服务,一些子域名正在使用SSL,而另一些则没有。我在让非SSL网站正常投放方面遇到了一些麻烦。每当我尝试访问它们时,它们会立即(使用正确的主机)重定向到SSL / HTTPS版本。我在下面附上了我的位置栏。我已经在请求处理时读取了nginx块,但无法弄清楚如何强制未加密的主机不被转发。 (http://nginx.org/en/docs/http/request_processing.html)
server {
listen 80;
server_name dev.example.ca dev.example.server2.example.tl;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
include proxy_params;
proxy_pass http://unix:/home/example/example/socket.sock;
}
location /static {
autoindex on;
alias /home/litobro/example/example/static/;
}
}
server {
listen 80;
server_name dutyroster.example.ca;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
include proxy_params;
proxy_pass http://unix:/home/example2/dutyroster/socket.sock;
}
location /static {
autoindex on;
alias /home/example/example2/static/;
}
location /socket.io {
proxy_pass http://unix:/home/example/example2/socket.sock;
proxy_redirect off;
proxy_buffering 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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
server {
listen 80;
server_name ex3.server2.example.tl example.ca www.example.ca;
location ~ .well-known/acme-challenge/ {
root /var/www/letsencrypt;
default_type text/plain;
}
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.ca www.example.ca example.server2.example.tl;
ssl_certificate /etc/letsencrypt/live/example.ca/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ca/privkey.pem;
include snippets/ssl-params.conf;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
include proxy_params;
proxy_pass http://unix:/home/example/example3/socket.sock;
}
}
我订购了服务器块,以便首先获得端口80请求,但这似乎仍然无法正常工作。在此先感谢您的帮助! (服务器块大部分都被剥夺了实际域名,但我认为我在域名替换方面有一致性)
答案 0 :(得分:0)
尝试评论该行,看看您的非ssl服务器名称是否仍然重定向到https。
答案 1 :(得分:0)
问题的原因是HSTS标头,它在snippets/ssl-params.conf
内设置。此标头告诉浏览器该网站将仅通过HTTPS连接。以下是使用Nginx设置此标头的示例:
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
如果标头值包含includeSubDomains
标志,如上例所示,则HSTS策略也将应用于主域的所有子域。这就是您的浏览器尝试通过HTTPS将所有请求发送到子域的原因。
请记住,现代浏览器会将HSTS网站列表存储在特殊缓存中,因此只需删除或修改Nginx中的标头即可立即生效。您需要以特定于浏览器的方式手动清除HSTS缓存。
还值得一提的是,使用includeSubDomains
标记被认为是good practice,因此保留它并为您的子域发布证书可能是个好主意。目前,有几个证书颁发机构,如Let's Encrypt,提供免费且易于安装的证书。