Tomcat 尾部斜杠与代理转发

Tomcat 尾部斜杠与代理转发

我在 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>,问题就消失了。

希望这可以让其他人免于头痛。

相关内容