我正在尝试在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;
答案 0 :(得分:2)
您可以尝试:
^(.*)(\w{4}-\w{8})(.*)$
上述正则表达式的解释:
^, $
-分别代表行的开始和结束。(.*)
-表示第一个与字母数字模式字符串之前的所有内容匹配的捕获组。(\w{4}-\w{8})
-表示与所需字母数字模式匹配的第二个捕获组。如果您不想包括_
,则可以手动分配它们;类似于[0-9A-Za-z]
。(.*)
-表示匹配字母数字模式字符串后的所有内容的第三个捕获组。$1$2.php$3
-用于替换零件;您可以将第一,第二和第三捕获组与.php
扩展名一起使用。您可以在here.中找到上述正则表达式的演示
答案 1 :(得分:0)
您无法使用?c=123
来匹配查询字符串(rewrite
)。当匹配location
和rewrite
语句时,Nginx使用标准化的URI,该语句已删除查询字符串。
rewrite
指令会将原始查询字符串附加到结果URI上,除非替换字符串以?
结尾。参见this document。
例如:
rewrite "^(/.{4}-.{8})$" $1.php last;
由于括号,整个正则表达式都必须用引号引起来。