nginx:从 if() 反向引用匹配并同时重写

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]

答案1

您可以在重写规则的正则表达式中执行一些负向前瞻操作,但我不推荐这样做。

我建议你重新考虑你的方法,而不是试图重复你已经做过的事情。不要试图把所有东西都塞进一次重写中,考虑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命名捕获
  2. 您可以使用负面前瞻断言来解决最后两个条件所遇到的困难。

请注意,查看您配置的大多数人完全不知道正则表达式的这些功能,并会对它们感到困惑。它们还可能对维护您自己的代码造成问题,特别是如果您在一次重写中加载太多内容时。

相关内容