如何为 url 编码转义字符?

How to encode escape characters for url?

我需要向站点地图添加一些 url。 如 this answers 中所述,应转义特殊字符。 问题是

http://somesite.com/search/some_mark/model////'''...\\,,,!!!"""№№№;;;%%%:::???***((()))___++

所以我有 model 的参数 ///'''...\\,,,!!!"""№№№;;;%%%:::???***((()))___++

我尝试使用 spring uri utils encode 方法进行转义,这是它的输出:

http://somesite.com/search/some_mark/model/%2F%2F%2F%27%27%27...%5C%5C%5C%2C%2C%2C%21%21%21%22%22%22%E2%84%96%E2%84%96%E2%84%96%3B%3B%3B%25%25%25%3A%3A%3A%3F%3F%3F%2A%2A%2A%28%28%28%29%29%29___%2B%2B

据我所知,这是合法的 url,但是当我将其输入到浏览器栏时,我收到了响应代码 400 Bad Request

我还尝试使用 java 的 URLEncoder.encode(..) 方法进行编码,在其输出下方:

http://somesite.com/search/some_mark/model/%2F%2F%2F%27%27%27...%5C%5C%5C%2C%2C%2C%21%21%21%22%22%22%E2%84%96%E2%84%96%E2%84%96%3B%3B%3B%25%25%25%3A%3A%3A%3F%3F%3F***%28%28%28%29%29%29___%2B%2B

如您所见,它没有转义星号 (***)。

所以我现在真的很困惑。 spring 是否以正确的方式编码,他的方法的输出是否应被视为合法的 url ?如果是,那么为什么浏览器无法发出请求?如果否,应为此目的使用什么实用程序?

最后我使用了 Spring URI Utils encode() 方法并添加了对斜杠的显式检查(/\),因此 /model/ 之后的部分将不包含他们。

基本上,斜线是保留的特殊字符,将 url 分成几部分,即使它们将被编码,许多软件也会以特殊方式使用它们。

例如,如果您在应用程序前面使用 nginx,它可能会 return Http 400 状态代码,除非您进行额外的配置。

如果您使用 tomcat,它也可以选择在 url:

中使用编码斜杠
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

或者,如果您的应用基于 Spring MVC 框架构建,它也 might have a problem 与它们一起构建。

基本上需要很多配置。

所以我的建议是在允许使用这个特殊字符作为 url 的一部分之前考虑一下。