2015-06-22 99 views
1

行爲不同,我看到在這兩種情況下不同的行爲:Nginx的位置語句和正則表達式匹配正常

location ~ /(?<version>v[12]) { 
    proxy_pass https://localhost/api/$version; 
} 

location /v2 { 
    proxy_pass https://localhost/api/v2; 
} 

如果我要求/v2/login,我看到在正則表達式配置/v2的請求,而直接匹配正確保留了整個請求url。

我嘗試添加第二個捕獲組,/(?<version>v[12])/(?<path>.*),然後它工作,主要是。但是,它似乎與PUT/POST混亂。

我有遺漏嗎?我讀了documentation,但據我所知,使用正則表達式或不使用正則表達式不應該有任何區別。

回答

2

不幸的是,官方文件缺少很多重要的註釋。如果您注意到Nginx的文檔無法解釋的異常,那麼我建議您使用wiki進行檢查。在你區分最有趣的部分是:

一種特殊的情況是在proxy_pass語句中使用的變量:不使用 請求的URL,你是全責,構建 自己的目標URL。

所以,只要你在proxy_pass directive引入$version,Nginx的開始駁回原始請求URI,僅發送什麼是proxy_pass URI的一部分。

這就是爲什麼如果你只需要覆蓋兩種情況(v1v2),我強烈建議不要混淆正則表達式,而是定義兩個通用的前綴位置,就像你在第二個例子中所做的那樣。 Nginx配置不是編程代碼,配置的重複部分非常好。

但是,如果由於某種原因,你真的必須使用正則表達式的位置,你就必須要麼重寫你的URI:

location ~ /(?<version>v[12]) { 
    rewrite ^/(.*)$ /api/$1 break; 
    proxy_pass https://localhost; 
} 

或構建完整的URI自己:

location ~ /(?<version>v[12])(?<rest>.*)$ { 
    proxy_pass https://localhost/api/$version$rest$is_args$args; 
}