nginx 仅将特定服务器名称重写为 https

nginx 仅将特定服务器名称重写为 https

这是关于两个子域名。第一个 (www) 应通过 http 访问。第二个 (cloud) 应通过 https 访问。

以下是我的条目的相关部分:

server {
        listen 80;
        server_name cloud.example.de;
        rewrite ^ https://$server_name$request_uri? permanent;  # enforce https
}

server {
        listen 443 ssl;
        server_name cloud.example.de;
        root /home/user/web/cloud;
}

server {
        listen 80;
        server_name www.example.de;
        root /home/user/web/cms;

        #etc.
}

当我现在打电话时http://cloud.example.de我被重定向到https://cloud.example.de很好。但是当我打电话时http://www.example.de我也被重定向到https://www.example.de,这让我找到了 cloud.example.com 的内容,因为这是唯一设置为由端口 443 使用的服务器名称。www

子域的访问日志中没有条目。
有另一个子域指向 phpPgAdmin。我可以正常访问它,它没有被重写。

server {
        listen 80;
        server_name pgsql.example.de;
        root /home/user/web/phppgadmin;

        #etc
}

缺什么?仅当服务器名称与 cloud.example.de 匹配时才进行重写
服务器条目的顺序是否相关或无关紧要?


在 Ubuntu 11.04 上使用 nginx 0.8.54。

答案1

您提供的示例配置看起来正确,但我怀疑它是否能像您描述的那样工作(您在尝试简化它时可能做了太多更改)。

您是否在类似 的程序中遇到了错误重定向curl,还是仅在浏览器中遇到错误重定向?我处理过permanent在 Mozilla 中永久缓存的情况(例如来自之前的nginx.conf),而没有任何方法可以使单个301缓存条目无效,因此,您确定这不是缓存问题吗?

无论如何,您也可以尝试使用if使重定向有条件(也许第一个服务器被选为默认服务器):

    if ($host = "cloud.example.de") {
            rewrite ^ https://$server_name$request_uri? redirect;
    }
    return 403;

或者,另一种选择,

server {
    listen 80;
    listen 443 ssl;
    server_name cloud.example.de;
    if ($scheme != "https") {
        rewrite ^ https://$server_name$request_uri? redirect;
    }
    root /home/user/web/cloud;
}

并尽量curl -v确保您能看到那里的东西。

相关内容