【问题标题】:Nginx redirects inconsistent across browsersNginx 跨浏览器重定向不一致
【发布时间】:2017-04-09 20:38:25
【问题描述】:

我有一个顶级域。我们称之为example.com。我还有三个子域:www.example.comapp.example.comstatic.app.example.com

我希望 example.com 重定向到 www.example.com。 我还希望所有 http 流量都重定向到 https,同时保留域和路径。

这些是我的 nginx 配置文件(抱歉,有点长):

###############  app.example.com ###################

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;
    return 301 https://app.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    server_name app.example.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /assets {
        alias /var/www/exampleapp/dist/public;
    }

    location /.well-known {
        alias /var/www/example/.well-known;
    }
}

###############  static.app.example.com ###################

server {
    listen 80;
    listen [::]:80;
    server_name static.app.example.com;
    return 301 https://static.app.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    server_name static.app.example.com;

    location / {
        alias /var/www/exampleapp/public/;
    }

    location /.well-known {
        alias /var/www/example/.well-known;
    }
}

###############  www.example.com & example.com ###################

server {
    listen 80;
    listen [::]:80;
    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    server_name example.com;
    return 301 $scheme://www.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    server_name www.example.com;

    location / {
        proxy_pass http://localhost:5500;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /assets {
        alias /var/www/example/dist/public;
    }

    location /.well-known {
        alias /var/www/example/.well-known;
    }
}

现在这是奇怪的部分。这在桌面 chrome 和 firefox 上运行良好。但是在移动 chrome 和 edge 上,它做了一些奇怪的事情。它从example.com 重定向到app.example.com。我不知道它是什么。我尝试清除浏览器缓存并使用 nginx 设置,但没有任何帮助。

【问题讨论】:

    标签: redirect nginx browser


    【解决方案1】:

    您在端口 80 上缺少example.com 的服务器。因此,使用http 连接到example.com 的任何浏览器都将使用默认服务器(恰好是app.example.com 服务器块)。

    您应该将最后一个 http server 块更改为:

    server {
        listen 80;
        listen [::]:80;
        server_name www.example.com example.com;
        return 301 https://www.example.com$request_uri;
    }
    

    【讨论】:

    • 我实际上比您早几分钟发布了我自己的问题的答案,但是由于 SO 不允许我接受我自己的答案(至少再过两天),我会只接受你的。无论如何,谢谢。
    【解决方案2】:

    所以浏览器不一致原来只是缓存。即使我清除了浏览器缓存,它仍在缓存 301 重定向。显然,破坏重定向缓存的最佳方法是将随机查询字符串附加到 url。

    关于错误的重定向,一位朋友指出,如果您不为裸域指定处理程序,则使用第一个子域,这就是这里发生的 http 请求。 https很好,因为我正在听。我刚刚在端口 80 上为裸域添加了另一个服务器块。这样就解决了问题。

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多