当URI在一行中有两个斜杠时,Jetty返回400,而Tomcat不关心

woobm2wo  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(195)

我有一个客户端,它提出的请求如下所示:
https://app.foo.com/foo//bar/baz/
当我的foo war在tomcat中托管时,URL解析并返回它应该返回的任何内容。我最近尝试在jetty中运行相同的war文件,当在jetty中运行时,相同的URI返回一个400的错误请求。有没有办法配置Jetty不关心这个,如果它在URL中看到一行中有2+个斜杠,就像Tomcat那样把它当作只有1个斜杠来处理?

u3r8eeie

u3r8eeie1#

根据URI规范,这被认为是一个“模糊的空路径段”,因此Jetty中的默认配置在看到它们时返回“400 Bad Path”。
URI规范中有许多部分会导致解释不明确,而所有这些部分都在Jetty UriCompliance.Violation中指定。
请参阅:

  • https://tools.ietf.org/html/rfc3986#section-3.3
  • https://github.com/eclipse/jetty.project/blob/jetty-11.0.12/jetty-http/src/main/java/org/eclipse/jetty/http/UriCompliance.java#L40-L72

以下是可以启用/禁用的UriCompliance违规。
| 关键字|项目名称|规格参考|
| - -|- -|- -|
| AMBIGUOUS_PATH_SEGMENT个|允许不明确的路径段,例如/foo/%2e%2e/bar| RFC 3986协议|
| AMBIGUOUS_EMPTY_SEGMENT|允许不明确的空段,例如//| RFC 3986协议|
| AMBIGUOUS_PATH_SEPARATOR|允许在URI段中使用不明确的路径分隔符,例如/foo/b%2fr| RFC 3986协议|
| AMBIGUOUS_PATH_PARAMETER|允许URI段中存在不明确的路径参数,例如/foo/..;/bar/foo/%2e%2e;param/bar| RFC 3986协议|
| AMBIGUOUS_PATH_ENCODING个|允许在URI段中使用不明确的路径编码,例如/%2557EB-INF| RFC 3986协议|
| UTF16_ENCODINGS|允许UTF-16编码,例如/foo%u2192bar| w3c/草稿-数据-虹膜|
UriComplianceServerConnector类使用的HttpConfiguration中配置。
如果您选择通过UriCompliance配置允许这些,请记住您所做的一切都是允许它们进入Jetty。
这是因为许多关心空路径段的用户实际上想要额外的空路径段,以用于gRPC、REST等将荣誉空段的工具。
Jetty提供了一个压缩选项,形式为RewriteHandler,它是CompactPathRule
servlet规范Maven组最近讨论了RFC 3986中指定的这些不明确的路径行为,但没有讨论//的具体情况。

相关问题