Apache-2.2

nginx:來自 if() 的反向引用匹配並同時重寫

  • June 6, 2017

我需要將以下規則從 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 的反向引用匹配。

  1. 如何在以下重寫中從 nginx 中的 if () 反向引用匹配?
  2. 有什麼想法可以添加最後兩個條件嗎?

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語句),但是您在一個正則表達式中涵蓋兩者的方式iddaily我認為您最好編寫一些更符合您網站語義的東西。它將比您目前所做的更具可讀性,並且執行得更好。

如果您真的想採用目前的方法,那麼 regex 擁有您需要的工具。

  1. 您可以使用 PCRE 的命名 capture
  2. 您對最後兩個條件的困難可以使用否定的前瞻性斷言來處理。

請注意,大多數查看您的配置的人將完全不知道正則表達式的這些功能,並且會被它們混淆。它們也可能成為維護您自己的程式碼的問題,特別是如果您在一次重寫中不斷載入太多內容。

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