在铬这个configuration导致无限redirect循环,并在其他浏览器中,我已经尝试了一个请求https://www.example.com/servlet/foo导致redirect到https://www.example.com/foo /而不是https://www.example.com/servlet/foo/然而,这只有当我不包括尾随/在请求url的末尾(即http://www.flightboard.net/servlet/ foo / works就好了)。
<VirtualHost *:80> # ... RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/servlet(/.*)?$ RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] </VirtualHost> <VirtualHost *:443> # ... ProxyPass /servlet/ ajp://localhost:8009/ ProxyPassReverse /servlet/ ajp://localhost:8009/ </VirtualHost>
端口443上的虚拟主机没有可能导致问题的重写规则,被引用的tomcat上下文不会发送任何redirect,并且如果将ProxyPass和ProxyPassReverse指令更改为:
ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/
一切工作正常(除了从www.example.com的一切都被传递给代理,而不是我想要的行为)。 我相当肯定,这是我的代理设置configuration方式的问题,因为我logging了所有来自Apache的重写输出,这是完全正确的。
从mod_proxy_ajp切换到mod_proxy_http似乎解决了这个问题。
ProxyPass /servlet/ http://localhost:8080/ ProxyPassReverse /servlet/ http://localhost:8080/
不幸的是,这具有不传递远程连接的IP地址的副作用。 另一种方法是添加一个重写规则,以便在末尾匹配缺less斜杠的url:
RewriteCond %{REQUEST_URI} ^/servlet/[^/]+$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]
我不确定这是否是您的问题,但ProxyPassReverse不能与ajp:url一起使用。 如果匹配,ProxyPassReverse将导致重写位置:标头。 由redirect生成的标头具有http:URL,而不是ajp:
你应该可以使用:
ProxyPass /servlet/ ajp://localhost:8009/ ProxyPassReverse /servlet/ http://hostname/
即使用ajp:代理到tomcat,但是使用http:来匹配和重写redirect头文件。 返回的头文件也可能具有服务器的真实主机名而不是localhost。 (尽pipe本地主机适用于ProxyPass)。 您可以使用'curl -I'检查返回的标题,以查看您需要匹配的内容。
看到这个答案在一些链接的计算器。
(这个问题已经过了几个月了,但是我遇到了同样的问题,而且在寻找答案的过程中遇到了困难。)