我已经用谷歌搜索了这个问题的废话,但一无所获,所以希望你们能提供帮助。
目标
配置反向代理(使用 Apache 的 mod_proxy)以启用通过 Internet 访问内部 PHP 应用程序,使用 mod_proxy_html 重写我的应用程序中的 URL。
问题描述
考虑仅使用以下代码的landing.php:
<a href="redirect.php">redirect.php</a>
和 redirect.php 仅:
<?php
header("Location:http://internal.example.com/landing.php");
?>
使用我的 httpd.conf 中的这个片段
UseCanonicalName On
LoadFile /usr/lib64/libxml2.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
<VirtualHost *:80>
ServerName example.com
<Proxy *>
Order deny,allow
Allow from all
AllowOverride None
</Proxy>
ProxyPass / http://internal.example.com/
ProxyPassReverse / http://internal.example.com/
ProxyHTMLLinks a href #Commenting out this line fixes the problem, but I need it for rewriting
ProxyHTMLEnable On
RequestHeader unset Accept-Encoding
</VirtualHost>
当我转到http://example.com/landing.php并单击“redirect.php”时,它应该带我回到landing.php 页面。相反,我在 Firefox 中收到“此连接已重置”,或在 Chrome 中收到“未收到数据”。(仅供参考,去http://internal.example.com/redirect.php重定向正确。)
问题:
为什么重定向会通过反向代理失败,我该如何解决这个问题?
提示
我发现了一些可能有用的东西......
我知道如果我注释掉“ProxyHTMLLinks a href”,这将正常工作。但显然,这是我需要的重写功能。
我还可以将 redirect.php 页面更改为以下内容,这样可以正常工作:
<?php
header("Location:http://internal.example.com/landing.php");
?>
random text
我猜这个文本以某种方式对页面或 HTTP 标头做了一些事情,使 mod_proxy_html(或更具体地说是 ProxyHTMLLinks)的运行方式与没有它时不同。
我还可以将 redirect.php 页面更改为以下内容并让它工作:
<?php
header("Location:http://internal.example.com/landing.php");
header("Content-Type:");
?>
这是因为 ProxyHTMLLinks 默认只应用于 Content-Type 文本/html 文件。但是,我不想破解所有对 header("Location:...") 的调用来完成这项工作。我不介意更改对 header("Location:...") 的所有调用,假设我正在更改的是纠正问题,而不是创建 hack。
最后,我在反向代理服务器上进行了一些数据包嗅探,发现标头(“Location:...”)向反向代理服务器发送了 HTTP/1.1 302 Not Found,但它没有通过它到请求redirect.php 的浏览器。当我尝试上述“解决方案”之一时,302 然后从反向代理服务器传递到请求redirect.php 的计算机。我的理解是Location头应该去浏览器,然后浏览器应该请求传回的新位置。所以它失败了,因为 302 没有进入浏览器......
仅供参考,我已经尝试查看错误日志以查看 mod_proxy_html 是否在某处失败,但我没有看到任何内容,尽管我对有关日志记录的具体建议持开放态度,因为我不是 100% 确定我是否'正在正确设置日志记录。
抱歉,这太长了,只是想尽可能具体。提前致谢!