我在 Apache 中有如下反向代理设置:
地址为 www.example.com/folder 的服务器 A 是反向代理服务器。
它映射到:地址为 test.madeupurl.com 的服务器 B
这种作品。但是我遇到的问题是,在 www.example.com/folder 上,所有相关链接的形式都是 www.example.com/css/examplefilename.css 而不是 www.example.com/folder/css/examplefilename。 css
我该如何解决?
到目前为止,我的反向代理在服务器 A (www.example.com) 上有这个:
<Location /folder>
ProxyPass http://test.madeupurl.com
ProxyPassReverse http://test.madeupurl.com
</Location>
Apache ProxyPassRewrite 不会重写从http://test.example.com收到的响应正文,仅重写标题(如重定向到 404 页面等)。
多种选择:
一)重写内部应用程序以使用相对路径而不是绝对路径。即
../css/style.css
代替/css/style.css
二)将内部应用程序重新部署在同一子目录
/folder
中,而不是在 test.example.com 的根目录中。三)一个和两个通常不太可能发生......如果你很幸运,内部应用程序只使用两个或三个子目录,而这些子目录在你的主站点上没有使用,只需编写一堆 ProxyPass 行:
四)为内部应用程序创建一个单独的子域并简单地反向代理所有内容:
五)有时开发人员
完全无能为力,他们的应用程序不仅生成绝对 URL,甚至在其 URL 中包含主机名部分,生成的 HTML 代码如下所示<img src=http://test.example.com/icons/logo.png>
:A ) 您可以使用水平分割 DNS 和方案 4 的组合解决方案。内部和外部用户都使用 test.example.com,但您的内部 DNS 直接指向 test.example.com 的服务器的 IP 地址。对于外部用户,test.example.com 的公共记录指向您的公共网络服务器 www.example.com 的 IP 地址,然后您可以使用解决方案 4。
B ) 实际上,您不仅可以让 apache 代理对 test.example.com 的请求,还可以在将响应正文传输给您的用户之前重写响应正文。(通常代理只重写 HTTP 标头/响应)。apache 2.2 中的 mod_substitute。我还没有测试它是否与 mod_proxy 很好地堆叠,但也许以下工作:
作为HBruijn答案的补充,如果您选择解决方案(3) “ProxyPass”,您可能还必须使用mod_proxy_html重写 HTML 页面中的一些 URL。
参看。对于某些示例,如何使用反向代理正确处理相对 url 。
作为一个应用示例,您可以使用以下
ProxyHTMLURLMap
规则配置 Apache,将your-domain-name.com/pad中的所有内容转发到在端口 9001 上本地运行的Etherpad实例:您可以使用以下方式制作反向代理:
1. 安装 mod_proxy_html
加载 mod_proxy_html 模块
并使用以下设置
希望这有帮助。