2017-10-17 126 views
0

所以我一直在使用NGINX Maps來處理重定向,它們運行良好。但是最近我發現了一個問題,我無法弄清楚我的生活正在發生什麼。Nginx MAP重定向問題

我有三個地圖部分通過默認設置相互饋送。

map $host$uri $path_redirects { 
    ~*^example.com\/(sample-url-path-)(a|b|c|d)+(\d+|\%.*)$ /$1$2;                  
} 

map $host$uri $page_redirects { 
    default $path_redirects; 
} 

map $host$uri$args $redirect_uri { 
    default $page_redirects; 
    ~*^example.com\/(.*).html(\?PageSpeed.*)$  /$1.html;         
} 

然後我實際上基於$ redirect_uri重定向。有點令人困惑,但它可以幫助我保持我的重定向組織。

它一直工作正常,但現在我有一個問題,我懷疑是不是有關的地圖,但我無法弄清楚什麼。

代入regex101.com我可以得到這些規則匹配:

https://regex101.com/r/kgFE7k/1

https://regex101.com/r/JLlcZi/2

但是,當我在我的映射有他們,他們根本就不重定向。我得到一個404

(重定向)example.com/sample-url-path-c2
(不重定向)example.com/sample-url-path-c%23.WYzyrdPyvVo
(不重定向)example.com/sample-url-page.html?PageSpeed=noscript

任何人都可以看到我做錯了什麼?

+0

因此我找到了問題的一部分。 NGINX $參數不包含'?'。所以我不得不修改我最後的地圖部分:map $ host $ uri?$ args $ redirect_uri {} –

+0

我也修復了另一個問題。 –

回答

0

所以這個問題是我的錯。我能夠通過2件事發現它。

我意識到%23實際上是URL編碼,是'#'而不是路徑的一部分。這就是爲什麼我沒有得到%23的匹配,但regex101工作,因爲它將它視爲純文本。

二,NGINX變量$ args不包括?來自URL字符串。所以,'?'的匹配在正則表達式中並不匹配。

要解決我提出的這兩個規則以我的$ args映射部,它的內容:

map $host$uri?$args $redirect_uri { 
    default $page_redirects; 
    ~*^example.com\/(.*).html(\?PageSpeed.*)$  /$1.html; 
    ~*^example.com\/(sample-url-path-)(a|b|c|d)+(\d+|\#.*|\%.*)$ /$1$2;          
} 

幫助別人與調試,它有助於在調試頭到你的迴應。在NGINX配置中,添加:

#DEBUG HEADERS 
add_header X-host   "$host" always; 
add_header X-uri   "$uri" always; 
add_header X-args   "$args" always; 
add_header X-full-url  "$host$uri$args" always; 
add_header X-redirect-path "$path_redirects" always; 
add_header X-redirect-page "$page_redirects" always; 
add_header X-redirect-uri "$redirect_uri" always; 

更改變量以適合。永遠的部分使NGINX始終如一地服務於它,沒有,它只提供一些HTTP響應代碼,但404不是其中之一。