我需要在站点地图中添加一些网址。 如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
据我所知,这是合法的网址,但当我将其输入浏览器栏时,我收到了回复代码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?如果是,那么为什么浏览器无法提出请求?如果不是,应该使用什么效用?
答案 0 :(得分:0)
最后我使用了Spring URI Utils encode()方法并添加了对斜杠的显式检查(/
和\
),因此/model/
之后的部分不会包含它们。
基本上斜杠是保留的特殊字符,它将url分成几部分,即使它们被编码,很多软件也会以特殊方式与它们一起运行。
例如,如果您在应用前使用nginx,则可能会返回Http 400
状态代码,除非您进行了其他配置。
如果您使用tomcat,它还可以选择在url中使用编码斜杠:
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
或者,如果你的应用程序构建在Spring MVC框架上,那么它们也会might have a problem。
基本上它需要很多配置。
所以我的建议是在允许使用这个特殊字符作为网址的一部分之前进行思考。