特定正则表达式模式的Nginx重写规则

时间:2020-06-26 14:26:21

标签: regex nginx

我正在尝试在NGINX中重写以下网址:

https://example.com/ab12-cdef4567?c=123

对此:

https://example.com/ab12-cdef4567.php?c=123

模式将始终为{4个字母数字}-{8个字母数字}

这是我没有成功的尝试:

rewrite ^/(.{4}-.{8})?(.*)$ /$1.php?$2 last;

2 个答案:

答案 0 :(得分:2)

您可以尝试:

^(.*)(\w{4}-\w{8})(.*)$

上述正则表达式的解释:

  • ^, $ -分别代表行的开始和结束。
  • (.*) -表示第一个与字母数字模式字符串之前的所有内容匹配的捕获组。
  • (\w{4}-\w{8}) -表示与所需字母数字模式匹配的第二个捕获组。如果您不想包括_,则可以手动分配它们;类似于[0-9A-Za-z]
  • (.*) -表示匹配字母数字模式字符串后的所有内容的第三个捕获组。
  • $1$2.php$3 -用于替换零件;您可以将第一,第二和第三捕获组与.php扩展名一起使用。

Pictorial Representation

您可以在here.中找到上述正则表达式的演示

答案 1 :(得分:0)

您无法使用?c=123来匹配查询字符串(rewrite)。当匹配locationrewrite语句时,Nginx使用标准化的URI,该语句已删除查询字符串。

rewrite指令会将原始查询字符串附加到结果URI上,除非替换字符串以?结尾。参见this document

例如:

rewrite "^(/.{4}-.{8})$" $1.php last;

由于括号,整个正则表达式都必须用引号引起来。