Nginx服务器块排序

时间:2016-11-18 17:50:06

标签: ssl nginx

我在子域上有多个站点,我尝试使用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请求,但这似乎仍然无法正常工作。在此先感谢您的帮助! (服务器块大部分都被剥夺了实际域名,但我认为我在域名替换方面有一致性)

2 个答案:

答案 0 :(得分:0)

抱歉,我对nginx没有太多经验,但在conf文件的末尾有两个服务器块。第一次收听端口80你有“返回301 https:// $ host $ request_uri;”需要这条线吗?

尝试评论该行,看看您的非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,提供免费且易于安装的证书。