如何使用相对路径正确完成反向代理

时间:2015-06-26 19:46:04

标签: apache redirect proxy

我有以下设置来屏蔽/重定向带端口的URL到代理 离。

VirtualHost *:80>
ServerName psweb1.example.com
ServerAlias psweb1.example.com
ProxyPass /demo1 http://psweb1.example.com:8002/
ProxyPassReverse /demo1 http://psweb1.example:8002/
</VirtualHost>

此设置的问题在于重定向不会捕获任何相对路径。

例如 psweb1.example.com:8002/main/login/login.jsp重定向到psweb1.example.com/demo1/main/login/login.jsp

登录后: 重定向不遵循psweb1.example.com/demo1/*的结构 而是尝试返回到psweb1.example.com / *

如何确保正确的映射始终与所有正确的相对路径保持一致? 如:

psweb1.example.com:8002/main > psweb1.example.com/demo1/main
psweb1.example.com:8002/main/login > psweb1.example.com/demo1/main/login
psweb1.example.com:8002/side/* > psweb1.example.com/demo1/side/*

等等。

1 个答案:

答案 0 :(得分:1)

我认为你的问题实际上是绝对路径。我怀疑相对路径是否正常工作。考虑:

您的浏览器会抓取一个页面psweb.example.com/demo1/main/,其中包含<a href="login">...</a>形式的链接。当您按照该链接浏览时,浏览器将获取/demo1/main/login,这正是您想要的。

现在考虑<a href="/main/login">...</a>形式的链接。这是绝对链接。在这种情况下,您的浏览器将会抓取psweb.example.com/main/login

您无法使用ProxyPass指令解决此问题,因为它与浏览器和服务器之间的HTTP交换无关。这是Web应用程序生成的HTML内容的问题。您通常有几个选择:

  1. 正确配置Web应用程序。许多应用程序都有某种“基本URL”设置,专门针对这种情况而设计。

  2. 修复Web应用程序。编辑代码以(a)始终生成相对链接或(b)始终添加正确的基本URL。

  3. 使用HTML过滤器,例如mod_proxy_html,它可以作为Apache的最新版本(我认为是2.4及更高版本)的一部分,也可以作为早期版本的第三方模块。< / p>