尝试让 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/
处理后面的部分。#
因此,您需要了解您的应用软件究竟如何处理这些片段部分,并在此基础上进行配置。