如何配置nginx重定向到https ...除了一个目录

时间:2017-02-19 20:15:50

标签: http redirect nginx https lets-encrypt

我正在设置一个nginx网络服务器来支持多个虚拟主机。按照最佳实践,我希望将任何http://请求重定向到等效的https://。

这很简单,但我希望有一个例外:对/.well-known/下的任何文件的任何请求都应该作为http提供,而不需要https重定向。任何使用LetsEncrypt的人都会将'.well-known'目录识别为LetsEncrypt查找验证文件的位置。这些必须通过HTTP提供。

到目前为止,我有一个'default'的配置文件,如下所示:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /var/www/default/www;
    index index.php index.html index.htm;
    location ^~ /.well-known/ {
        allow all;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

然后,对于每个虚拟主机,我有一个单独的文件,如下所示:

server {
    listen 443 ssl;
    server_name myexamplevirtualhost.com;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # lots more SSL-related stuff
    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name myexamplevirtualhost.com;
    location / {
        return 301 https://$server_name$request_uri;
    }
    location /.well-known/ { }
}

如果我请求,例如http://myexamplevirtualhost.com/,我会被重定向到https://myexamplevirtualhost.com/ - 这就是我想要的。同样,https://myexamplevirtualhost.com/的直接请求也按预期工作。

但是,如果我尝试:http://myexamplevirtualhost.com/.well-known/foo123,而不是服务器只是提供http://myexamplevirtualhost.com/.well-known/foo123(这是目标),它会重定向到https://myexamplevirtualhost.com/.well-known/foo123

我尝试过很多不同的事情 - 改变位置规则的顺序等等 - 但我似乎仍然无法得到我想要的行为。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果启用了HSTS(HTTP严格传输安全性),您将无法关闭" https用于某些页面,因为https将被强制用于整个域。您可以使用一些错综复杂的HTTP 302重定向设置来完成这项工作,但我不确定您为什么要这样做。如果您的.well知道目录是通过HTTPS提供的,那么让我们更新证书会毫无困难。