我在 Ubuntu 18 上的 Apache 2 服务器后面运行 Tomcat 9。我使用反向代理将流量发送到 Tomcat,apache conf 文件中的内容如下:
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8080/MyApp/"
ProxyPassReverse "/" "http://localhost:8080/MyApp/"
ProxyPassReverseCookiePath "/" "http://localhost:8080/MyApp/"
ProxyPassReverseCookieDomain "/" "http://localhost:8080/MyApp/"
除了一个方面之外,一切都运行良好。如果用户省略了子文件夹的尾部斜杠,则 Tomcat 会错误地重定向。例如:
https://www.mywebsite.com/login/
工作正常,但是如果用户输入
https://www.mywebsite.com/login
Tomcat 将重定向到
https://www.mywebsite.com/MyApp/login/
它将 MyApp 文件夹粘贴到重定向中。有什么办法可以解决这个问题吗?
谢谢
答案1
我知道这是一篇老帖子,但是由于我甚至在 2024 年使用 tomcat 10.1 时也一直在努力解决这个问题,并且在最终起作用之前尝试了太多选项,所以我决定发布我发现的内容。
总结:
scheme="https"
在您的块中设置<Connector>
。问题源自 Tomcat。
我找到这个解决方案的途径
我只发现了这个问题和另外一个问题:haproxy/apache/tomcat - 没有尾部斜杠会导致 301 重定向(我也用这个答案来回答)但关于这个话题没有太多内容。
由于我们也有 nginx/tomcat 的混合,我无法找出是谁在执行 https 到 http 的重定向。我将展示我尝试过的方法,如果上述解决方案不起作用,它们可能适用于您的情况。
- 尝试 1:添加
proxyPort="443"
到<Connector>
阻止。在糟糕的重定向中失败http://hostname:443/path
- 尝试 2:添加
mapperContextRootRedirectEnabled="false" mapperDirectoryRedirectEnabled="false"
到<Context>
区块中。也尝试过,true
但遗憾的是没有任何变化。 useRelativeRedirects="true"
尝试 3:在块中设置<Context>
。虽然这听起来非常有用,而且在直接向 tomcat 发出请求(不使用 nginx)时确实有效,并给出了重定向/path
。但在通过 nginx 发出请求时,这似乎不起作用。我真的希望有一天我能解决这个问题。- 尝试 4:确保这确实是 Tomcat 的错误,因为上述设置在本地有效。通过
sendRedirectBody="true"
在<Context>
块中设置可以清楚地看出这是 tomcat 的问题,因为响应主体现在也包含错误的重定向 URL。 - 尝试 5:阅读https://tomcat.apache.org/tomcat-10.1-doc/config/http.html#Common_Attributes希望找到一些有用的东西。如前所述,这使我改变了
scheme="https"
块<Connector>
,问题就消失了。
希望这可以让其他人免于头痛。