Nginx

是否可以使用 nginx 規範化“雙點”URL?

  • July 7, 2021

根據像這樣的RFC3986 URL

http://example.com/catalog/category/goods/../brand/product.html

由一些 UserAgent (捲曲將是很好的例子)轉換為 http://example.com/catalog/category/brand/product.html

如果我愚蠢的 UserAgent 無法以正確的方式解析原始 URL,我該如何使用 nginx 重寫來實現這種行為?

有沒有可能?

您可以將/./序列和/goods/../序列替換為單個/. 例如:

rewrite ^(.*)/\./(.*)$ $1/$2 redirect;
rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 redirect;

/(?!\.\.)[^/]+/序列應該匹配任何不是另一個的路徑元素..。上述重寫是遞歸的,並發出 302 響應,直到正確刪除所有/.//../序列。

或者,通過將rewrite...last語句放置在合適的location塊中,可以使用內部重定向來實現相同的目的。例如:

location / {
   rewrite ^(.*)/\./(.*)$ $1/$2 last;
   rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 last;
}

在這種情況下,瀏覽器地址欄上顯示的 URL 不會改變。

有關該指令的詳細資訊,請參閱此文件,有關否定前瞻斷言的詳細資訊,請參閱此連結rewrite

引用自:https://serverfault.com/questions/910754