TELA Asked: 2021-06-13 16:11:26 +0800 CST2021-06-13 16:11:26 +0800 CST 2021-06-13 16:11:26 +0800 CST Nginx 位置匹配正则表达式年/月/日/* 772 我有一些旧的 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; } 请问我到底哪里错了.. nginx regex 1 个回答 Voted Best Answer Richard Smith 2021-06-13T23:03:48+08:002021-06-13T23:03:48+08:00 第一个问题是所有 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; }
第一个问题是所有 Nginx URI 都以前导
/
. 所以你的正则表达式永远不会匹配。第二个问题是,每当评估新的正则表达式时,都会覆盖数字捕获。所以在你的配置中,
$1
永远都是空的。您可以使用命名捕获:
或者,将数字捕获放在
rewrite
语句中:或使用
try_files
语句代替rewrite
: