Nginx 位置与正则表达式 year/month/day/* 匹配

Nginx 位置与正则表达式 year/month/day/* 匹配

我有一些旧的 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,它可能有这些前缀。

相关内容