我有一个慈善机构的旧网站,运行在旧的 Apache 1.3 实例上,后面是运行 proxypass 的 Apache 2。当请求到达 example.com 时,Apache 2 会将其内部发送到 localhost:8080,这样就可以正常工作。
问题:
example.com/blog/有效,但是example.com/blog(没有尾部斜杠)则不会。它在 Chrome 中更改为的 URL 是例如.com:8080/blog/但它并不存在。
对于所有其他目录来说也是如此。
阿帕奇 2:
<VirtualHost *:80>
ServerName example.com
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
阿帕奇 1:
NameVirtualHost *:8080
<VirtualHost *:8080>
DocumentRoot /usr/www/html/
ServerName example.com
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$
RewriteRule .* - [F]
</VirtualHost>
我认为一个简单的解决方案是在任一虚拟主机中添加重写规则,但尽管尝试了很多次,我还是没有成功。我认为一个关键问题是当没有斜线时,它会错误地查找 example.com:8080。如果有人能帮助我,那就太好了,问我任何有用的附加信息。
答案1
我没有在您的配置中看到ProxyPassReverse
或mod_proxy_html
指令;具体来说,缺少ProxyPassReverse
很可能是导致问题的原因,因为后端 Apache 正在向斜线 URL 发送重定向,但在 Location: 标头中具有其内部名称,而没有ProxyPassReverse
前端 Apache 只会让该内部 URL 泄漏。
mod_proxy_html
用于处理相同的问题,但使用 HTML 而不是 HTTP 标头。除非您真的确保没有人会在 HTML 中放置完整的 URL(对于任何动态 Web 应用程序来说,这都是一个糟糕的选择)。