Twissell Asked: 2018-05-05 06:37:18 +0800 CST2018-05-05 06:37:18 +0800 CST 2018-05-05 06:37:18 +0800 CST 是否可以使用 nginx 规范化“双点”URL? 772 根据像这样的RFC3986 URL http://example.com/catalog/category/goods/../brand/product.html 由一些 UserAgent (卷曲将是很好的例子)转换为 http://example.com/catalog/category/brand/product.html 如果我愚蠢的 UserAgent 无法以正确的方式解析原始 URL,我该如何使用 nginx 重写来实现这种行为? 有没有可能? nginx 2 个回答 Voted pva 2021-07-08T10:07:36+08:002021-07-08T10:07:36+08:00 正如我默认看到的 nginx normailses URL。引用文档: 一个规范化的 URI,在解码以“%XX”形式编码的文本后,解析对相对路径组件“.”的引用。和“..”,以及可能将两个或多个相邻的斜线压缩成一个斜线。 我已经测试过,它在这里开箱即用(使用proxy_pass),或者你有什么问题吗? Best Answer Richard Smith 2018-05-05T07:37:11+08:002018-05-05T07:37:11+08:00 您可以将/./序列和/goods/../序列替换为单个/. 例如: rewrite ^(.*)/\./(.*)$ $1/$2 redirect; rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 redirect; 该/(?!\.\.)[^/]+/序列应该匹配任何不是另一个的路径元素..。上述重写是递归的,并发出 302 响应,直到正确删除所有/./和/../序列。 或者,通过将rewrite...last语句放置在合适的location块中,可以使用内部重定向来实现相同的目的。例如: location / { rewrite ^(.*)/\./(.*)$ $1/$2 last; rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 last; } 在这种情况下,浏览器地址栏上显示的 URL 不会改变。 有关该指令的详细信息,请参阅此文档,有关否定前瞻断言的详细信息,请参阅此链接。rewrite
正如我默认看到的 nginx normailses URL。引用文档:
我已经测试过,它在这里开箱即用(使用proxy_pass),或者你有什么问题吗?
您可以将
/./
序列和/goods/../
序列替换为单个/
. 例如:该
/(?!\.\.)[^/]+/
序列应该匹配任何不是另一个的路径元素..
。上述重写是递归的,并发出 302 响应,直到正确删除所有/./
和/../
序列。或者,通过将
rewrite...last
语句放置在合适的location
块中,可以使用内部重定向来实现相同的目的。例如:在这种情况下,浏览器地址栏上显示的 URL 不会改变。
有关该指令的详细信息,请参阅此文档,有关否定前瞻断言的详细信息,请参阅此链接。
rewrite