我正在尝试让 apache 2.4 反向代理 (RHEL 7.7) 与具有硬编码路径的应用程序一起工作,这使我的反向代理配置非常具有挑战性。此 serverfault 链接 (如何使用反向代理正确处理相对 URL) 非常棒,特别是方法解决方案 #3,它放入了一堆位置(这些位置已硬编码)。我的代理运行路径来区分应用程序(www.example.com/app1 和 www.example.com/app2)。在此示例中,/app2 已硬编码了一堆目录,如 /static 和 /api。将这些位置与 ProxyPass 和 ProxyPassReverse 一起放入效果很好,网站可以正常运行。
但是,出于某种原因,他们也硬编码了 /#/,我在某些地方的 href 链接中看到它们。因此,我遵循了该模式并为 /#/ 定义了一个位置。但是,它不起作用。出于某种原因,当我点击该链接时,它不会将其定向到 app2.internal.example.com 服务器,而是提供响应 www.example.com/ 的主页。在 URL 中,我看到它显示 www.example.com/#/SOMEWHERE,但显然没有到达 app2。配置文件如下。/#/ 是一个不能使用的特殊位置吗?对此有什么解决方案吗?提前致谢。
<Location /app2/>
ProxyPass https://app2.internal.example.com/
ProxyPassReverse https://app2.internal.example.com/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /static/>
ProxyPass https://app2.internal.example.com/static/
ProxyPassReverse https://app2.internal.example.com/static/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /api/>
ProxyPass https://app2.internal.example.com/api/
ProxyPassReverse https://app2.internal.example.com/api/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /#/>
ProxyPass https://app2.internal.example.com/#/
ProxyPassReverse https://app2.internal.example.com/#/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
答案1
URL 中的#
描述了 URL 片段,URL 的一部分,指示文档加载后浏览器将滚动到的文档位置。
一些 JavaScript 库滥用 URL 片段在客户端传递信息,以支持单页应用的各种功能。这种做法已不再流行(而且从来都不是一个好主意),此类应用需要更新以使用 History API 并适当更改这些 URL 以不再使用片段。您的开发人员几年前就应该这样做了。
有几个原因导致这个主意一开始就很糟糕,但对于您的情况来说最重要的是,URL 片段严格来说是客户端的,永远不会传递到服务器。如果您有一个 URL http://www.example.com/#/
,则路径是/
,这就是服务器所看到的全部。它永远不会看到 ,#/
因为这些只是客户端的。在纯 HTTP 中没有办法将其发送到服务器,因此您无法在 中匹配它Location
。或其他任何东西。