mod_proxy不正确的redirect行为

在铬这个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'检查返回的标题,以查看您需要匹配的内容。

看到这个答案在一些链接的计算器。

(这个问题已经过了几个月了,但是我遇到了同样的问题,而且在寻找答案的过程中遇到了困难。)