如何为 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 的一部分之前考虑一下。
我需要向站点地图添加一些 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 的一部分之前考虑一下。