当页面不存在时,如何透明地重定向用户而不重写 URL?

当页面不存在时,如何透明地重定向用户而不重写 URL?

我有一个节点 Web 应用程序,其中 nginx 充当代理。

这是server该网站的区块:

server {
        listen 80;

        server_name subdomain.example.org;

        location / {
                # Offline handling
                error_page https://example.org/502

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://127.0.0.1:4567;
                proxy_redirect off;

                # Socket.io Support
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

如果 Web 应用程序出现故障,则该error_page指令会将用户发送到站点外,但 URL 最终会发生变化。是否可以将用户发送到该站点,但在浏览器中保持相同的 URL?

答案1

作为文档说:

如果在内部重定向期间不需要改变 URI,则可以将错误处理传递到命名位置:

location / {
    error_page 404 = @fallback; }

location @fallback { 
    proxy_pass http://backend;
}

您还需要onproxy_intercept_errors指示。

另外,为了尊重您在示例()中给出的 URL 格式https://example.org/502,我必须使用$folder变量。

最后,你必须设置解析器指示。

总的来说,你会得到如下的结果:

location / {
   proxy_intercept_errors on;
   error_page 404 = @fallback;
   proxy_pass        http://127.0.0.1:4567;
   ...
   ...
}

location @fallback {
   resolver 8.8.8.8;   # <-- Put your own DNS Server here
   set $folder "502";
   proxy_pass https://example.org/$folder/;
}

相关内容