![Nginx 位置与正则表达式 year/month/day/* 匹配](https://linux22.com/image/767501/Nginx%20%E4%BD%8D%E7%BD%AE%E4%B8%8E%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%20year%2Fmonth%2Fday%2F*%20%E5%8C%B9%E9%85%8D.png)
我有一些旧的 url 模式需要重定向到 nginx 中的新位置。
一个典型的干净 URL 看起来像example.com/2021/06/13/78676.html?..
我大致尝试匹配每个块中的数字,例如:
location ~ "^[0-9]{4}/[0-9]{2}/[0-9]{2}/([0-9]+).html" {
rewrite ^ /archive.php?q=$1;
}
请问我到底哪里错了。
答案1
第一个问题是所有 Nginx URI 都以 开头/
。因此您的正则表达式永远不会匹配。
第二个问题是,每当评估新的正则表达式时,数字捕获都会被覆盖。因此,在您的配置中,$1
将始终为空。
您可以使用命名捕获:
location ~ "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/(?<value>[0-9]+)\.html" {
rewrite ^ /archive.php?q=$value last;
}
或者,将数字捕获放在rewrite
语句中:
rewrite "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/(?<value>[0-9]+)\.html" /archive.php?q=$1 last;
或者使用try_files
陈述代替rewrite
:
location ~ "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/([0-9]+)\.html" {
try_files nonexistent /archive.php?q=$1;
}
答案2
这有点小众,但我认为它可能会帮助某些人,而且评论太长了:
## noindex date archives ##
location ~ "^(.*)/[0-9]{4}/([0-9]{2}/)?([0-9]{2}/)?$" {
try_files $uri $uri/ /index.php?$args;
set $robots "noindex, nofollow, nosnippet, noarchive";
}
我们一直尝试在 WordPress 中为我们的 SlickStack 项目强制 noindex“日期档案”,经过大量测试后,这似乎完美地解决了问题。
问题是我们不想对以下潜在的博客文章取消索引:
https://example.com/2020/03/25/interesting-story-about-ducks/
因此,在这种情况下,$
位置匹配正则表达式末尾的字符至关重要,否则它将不会索引任何以这些日期参数为前缀的博客文章或内容!此外,?
紧随其后的 (groupings) 表示它们是可选匹配的,这使得此代码片段非常强大。
它不会索引如下的 URL:
https://example.com/2020/
https://example.com/2020/03/
https://example.com/2020/03/25/
...但不是像上面的示例博客文章那样的 URL,它可能有这些前缀。