nginx 只将特定的服务器名重写为 https

32b*_*oat 2 rewrite nginx https ubuntu-11.04

这是关于两个子域。第一个 (www) 应该通过 http 访问。第二个(云)应该通过 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.
}
Run Code Online (Sandbox Code Playgroud)

当我现在调用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
}
Run Code Online (Sandbox Code Playgroud)

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


在 Ubuntu 11.04 上使用 nginx 0.8.54。

cns*_*nst 9

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

您是否在诸如curl或仅在浏览器中收到错误的重定向?我处理过permanent在 Mozilla 中永久缓存的情况(例如从之前的nginx.conf),没有任何方法可以使单个301缓存条目无效,所以,您确定这不是缓存问题吗?

在任何情况下,您也可以尝试使用if使重定向有条件(也许第一台服务器被选为默认服务器):

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

或者,另一种选择,

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;
}
Run Code Online (Sandbox Code Playgroud)

并尝试curl -v确保您看到那里的内容。