haproxy/apache/tomcat - 没有尾部斜杠会导致 301 重定向

haproxy/apache/tomcat - 没有尾部斜杠会导致 301 重定向

我已经进行了以下配置:

haproxy(80,443)--> httpd(8443)--> tomcat(8096)

转到https://websrv1/test将导致 301 重定向到 haproxy 应代理请求的 httpd 端口。因此用户被重定向到http://websrv1:8443/test

但是,如果用户去https://websrv1/test/ - specifying a the trailing slash- 它就可以正常工作。

当用户未指定尾随斜杠时,如何防止这种重定向发生?

  • haproxy 配置?
  • apache url 重写?
  • tomcat url 重写?

答案1

问题出在 Apache 级别。

您可以尝试设置

UseCanonicalName On

ServerName websrv1:80

在您的 Apache 配置中使 Apache 使用正确的重写。

或者,你可以使用以下命令禁用尾部斜杠的重写

DirectorySlash Off

使用规范名称服务器名称目录斜杠

答案2

我知道这是一篇老帖子,但是由于我甚至在 2024 年使用 tomcat 10.1 时也一直在努力解决这个问题,并且在最终起作用之前尝试了太多选项,所以我决定发布我发现的内容。

总结:

scheme="https"在您的块中设置<Connector>。问题源自 Tomcat。

我找到这个解决方案的途径

我只发现了这个问题和另外一个问题:Tomcat 尾部斜杠与代理转发但关于这个话题,仅此而已。

由于我们也有 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>,问题就消失了。

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

相关内容