我想代理http://localhost:1006/
外部http://example.com/public/
世界。这是我的配置:
RewriteEngine On
# Append a slash if necessary
RewriteRule ^/public$ public/ [R,L]
# Request headers: Replace http://localhost:1006/ with http://example.com/public/
ProxyPass /public/ http://localhost:1006/
# Response headers: Replace http://example.com/ with http://example.com/public/
ProxyPassReverse /public/ http://example.com/
ProxyPassReverseCookiePath / /public/
<Location /public>
Require all granted
</Location>
这对于重写标头很有效,但服务器仍然认为其上下文路径是/
而不是/public/
,因此当它构造 URL 以嵌入 JSON 时,它们是不正确的。Httpd 仅重写标头,而不重写 JSON,因此它对此不做任何处理。
我不希望 httpd 重写 JSON(我读到该过程不可靠)。我注意到Host
httpd 发送到服务器的标头包含外部主机名,这使服务器能够更正 URL 的该部分。我是否可以设置其他标头来指示服务器使用不同的上下文路径?
意义,我可以在 httpd 上做什么来改变服务器的上下文路径而不直接改变服务器的配置/代码?
答案1
简短回答:不,实际上不是。通常,您的后端应用程序需要有一个选项来配置其自己的根 URL,以便它可以生成适当的链接。如果您的后端应用程序托管在 Tomcat 之类的东西中,那么只需将其安装为在相同的相对路径下可用(例如,您可以从 到 进行代理example.com/public/
)localhost:1006/public/
。
答案2
您可以尝试反向重写输出,但让后端应用程序认为它位于 /public 中要容易得多,因为如果您选择重写路径,在可预见的未来您将与内容重写玩打地鼠游戏。