Nginx重定向在浏览器之间不一致



我有一个顶级域名。我们称之为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上工作得很好。但是在移动版和边缘上,它做了一些奇怪的事情。它从example.com重定向到app.example.com。我不知道它是什么。我尝试清除浏览器缓存并使用nginx设置,但没有任何帮助。

端口 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;
}

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

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

最新更新