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反向引用匹配。

  1. 如何在后面的重写中从nginx的if()返回引用匹配?

  2. 任何想法如何可以添加最后两个条件?

RewriteCond %{REQUEST_URI} !mobSpecCycle [NC] RewriteCond %{REQUEST_URI} !mobSpecTheme [NC]

你可以在rewrite规则中的正则expression式中做一些负面的lookahead的东西,但我不推荐它。

我build议你重新考虑一下你的方法,而不是重复你所拥有的。 不要试图把所有东西都塞进一个重写中,并且考虑使用location块, if更less的话。 我不知道你的网站的逻辑是否足够真正地得到这个权利,但考虑更像这样的事情:

 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块中使用正则expression式(更喜欢使用if语句),但是你在一个正则expression式中覆盖iddaily的方式让我觉得你最好写一些遵循网站语义的东西。 它会更可读,并且执行比现在做的更好。

如果你真的想追求目前的方法,正则expression式有你需要的工具。

  1. 你可以使用PCRE的命名捕获 。
  2. 您的最后两个条件的困难可以通过使用负向预测断言来处理。

请注意,大多数看着你的configuration的人将完全不知道这些正则expression式的特征,并将被他们混淆。 他们也可能成为维护自己的代码有问题,特别是如果你不断加载到一个重写。