【问题标题】:how is reverse proxy done correctly with relative path如何使用相对路径正确完成反向代理
【发布时间】:2015-09-13 20:52:39
【问题描述】:

我有以下设置来屏蔽/重定向带有端口的 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/*

等等等等

【问题讨论】:

标签: apache redirect proxy


【解决方案1】:

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

您的浏览器获取页面psweb.example.com/demo1/main/,其中包含&lt;a href="login"&gt;...&lt;/a&gt; 形式的链接。当您在浏览器中点击该链接时,浏览器将获取 /demo1/main/login,这正是您想要的。

现在考虑&lt;a href="/main/login"&gt;...&lt;/a&gt; 形式的链接。这是一个绝对链接。在这种情况下,您的浏览器将获取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 及更高版本)的一部分,也可作为早期版本的第三方模块使用。

【讨论】:

  • 感谢您的回复。我不认为我接触过 1,所以 2 和 3 是更好的选择。 2还需要访问我没有的代码库。我已经阅读了一些关于#3 的帖子,但是我的安装是随 2.2 一起提供的,所以 mod_proxy_html 绝对不在构建中。我倾向于升级到 2.4,而不是使用这个 apache 模块的已编译 .so 进行更新,这有时会表现得很古怪?
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
相关资源
最近更新 更多