Nginx - 重写并将 pass_proxy 传递到另一个端口导致 404 未找到

Nginx - 重写并将 pass_proxy 传递到另一个端口导致 404 未找到

尝试让 URL 重写与端口转发一起工作,但似乎不起作用。

:8080我的应用服务器在端口上运行,而nginx工作在默认80端口。所以我不仅被迫重写 URL,而且还将请求转发到另一个端口。

实际上,我唯一想做的就是http://localhost:8080/#/cat/tom通过它的快捷方式查询现有资源http://localhost/tom,而无需任何重定向。

这是我根据nginx文档和其他问题做出的:

server {
    listen       80;
    server_name  localhost;
    root /;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        rewrite ^/([a-z]+)$ /#/cat/$1 break;
        proxy_pass http://localhost:8080;
        proxy_redirect off;
    }

    ...
}

尝试了其他配置,但都不起作用。当我访问时,http://localhost/tom它说404 not found虽然http://localhost:8080/#/cat/tom按预期工作。

日志没有提及任何错误。

如何强制这项工作按预期进行?

答案1

问题是这#/cat/tom是一条针对客户端应用程序而不是服务器端应用程序的指令。这意味着它需要发送到客户端(通过重定向)。

例如:

location = /tom {
    return 302 /#/cat/tom;
}
location / {
    proxy_pass http://localhost:8080;
    ...
}

您在问题中提到,您尝试在不使用重定向的情况下执行此操作,但不幸的是,如果您查看 URL 的结构,您会注意到,之后的任何内容都#不会发送到服务器。请参阅这个文件了解更多信息。

答案2

nginx 重写仅对 URL 的路径部分起作用。它对查询部分(由 分隔)不起作用,对由 分隔的部分(即片段)?也不起作用。#

实际上,当你http://localhost:8080/#/cat/tom在浏览器中输入你的URL时,你的浏览器会发送一个获取的请求,然后你的浏览器会自行http://localhost:8080/处理后面的部分。#

因此,您需要了解您的应用软件究竟如何处理这些片段部分,并在此基础上进行配置。

相关内容