Apache-2.2
nginx:來自 if() 的反向引用匹配並同時重寫
我需要將以下規則從 apache 轉換為 nginx:
RewriteCond %{QUERY_STRING} id=([^&]*) [NC,OR] RewriteCond %{QUERY_STRING} daily=([^&]*) [NC] RewriteCond %{REQUEST_URI} !mobSpecCycle [NC] RewriteCond %{REQUEST_URI} !mobSpecTheme [NC] RewriteRule ^rss\/mobSpec([^\/]+)/?$ /rss/mobSpec$1/mobSpec$1_%1.html [QSA,NC,L]
其中,例如重寫
/rss/mobSpecArticle/?id=26422
進入
/rss/mobSpecArticle/mobSpecArticle_26422.html
我開始如下
if ($args ~ id=([^&]*)|daily=([^&]*)) { rewrite ^/rss\/mobSpec([^\/]+)/?$ /rss/mobSpec$1/mobSpec$1_$2.html last; }
但是我不知道如何反向引用 id=(
$$ ^& $$*) 在重寫規則中?我把 $2 放在那裡,但它不起作用…… apache 有 %1 用於來自 RewriteCond 的反向引用匹配。
- 如何在以下重寫中從 nginx 中的 if () 反向引用匹配?
- 有什麼想法可以添加最後兩個條件嗎?
RewriteCond %{REQUEST_URI} !mobSpecCycle [NC] RewriteCond %{REQUEST_URI} !mobSpecTheme [NC]
您可以在重寫規則中的正則表達式中做一些負面的前瞻性事情,但我不推薦這樣做。
我建議你重新考慮你的方法,而不是試圖重複你所擁有的。不要試圖將所有內容都塞進一次重寫中,並考慮
location
越來越if
少地使用塊。我不太了解您網站的邏輯,無法真正做到這一點,但考慮一下更像這樣的事情:location /rss/mobSpecCycle { ... } location /rss/mobSpecTheme { ... } location /rss/mobSpecArticle { rewrite /rss/mobSpecArticle/mobSpecArticle_$arg_id.html } location /rss/mobSpecDaily { rewrite /rss/mobSpecArticle/mobSpecArticle_$arg_daily.html }
無論如何,根據需要在您的
location
塊中使用正則表達式(更喜歡使用if
語句),但是您在一個正則表達式中涵蓋兩者的方式id
讓daily
我認為您最好編寫一些更符合您網站語義的東西。它將比您目前所做的更具可讀性,並且執行得更好。如果您真的想採用目前的方法,那麼 regex 擁有您需要的工具。
- 您可以使用 PCRE 的命名 capture。
- 您對最後兩個條件的困難可以使用否定的前瞻性斷言來處理。
請注意,大多數查看您的配置的人將完全不知道正則表達式的這些功能,並且會被它們混淆。它們也可能成為維護您自己的程式碼的問題,特別是如果您在一次重寫中不斷載入太多內容。