我需要将以下规则从 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]
答案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
的方式让我认为您最好编写一些更符合您网站语义的内容。它将更具可读性,并且比您目前所做的执行效果更好。id
daily
如果您确实想追求当前的方法,那么 regex 就有您需要的工具。
- 你可以使用 PCRE命名捕获。
- 您可以使用负面前瞻断言来解决最后两个条件所遇到的困难。
请注意,查看您配置的大多数人完全不知道正则表达式的这些功能,并会对它们感到困惑。它们还可能对维护您自己的代码造成问题,特别是如果您在一次重写中加载太多内容时。