nginx中location的匹配和rewrite

jopen 8年前發布 | 8K 次閱讀 Nginx Web服務器

最近在線上進行nginx規則的調整的時候遇到一個問題,發現在location匹配時候可能會踩到的一個坑。

location在匹配規則的時候匹配的是歸一化之后的URL,比如多個斜杠或者URL中帶".", ".."的都會被

歸一化。

而在內部rewrite的時候新的URL地址是不會再次被歸一化的。這種不一致如果沒有留意可能會遇到問題。

比如:

if ($request_uri ~ "/api") {  
    rewrite (.*) /newapi/$1;   # 斜杠多余了
}

location /newapi/api {  
    set $testapi 1;
}

location /newapi {  
    # ...   
}

對于上面的配置中,rewrite的時候不小心多寫了個斜杠,對于這個配置,如果用地址:/api訪問的話  /newapi/api 這個location是不能被匹配的。而用地址/newapi//api直接訪問是可以匹配到/newapi/api這個location的。

本質上是因為用戶直接訪問的URL會先歸一化處理,而rewrite之后是不會處理的。

具體見文檔: http://nginx.org/en/docs/http/ngx_http_core_module.html

來自: http://blogread.cn/it/article/7220?f=hot1

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!