我有一个 URL,例如example.com/page.php?username=test
。我想将此 URL 重写为类似以下内容:example.com/test
仅当test
遵循以下正则表达式:/^[0-9a-zA-Z_-]{1,35}+$/
,否则为 404 页面。
答案1
这应该有效:
location /page.php {
if ($args ~ "^username=([0-9a-zA-Z_-]{1,35})$")
{
set $username $1;
rewrite . /$username last;
}
return 404;
}
诀窍在于,在location
指令中,Nginx$uri
根据文档此变量不包含任何获取参数。因此,实现目标的唯一方法是首先匹配 uri /page.php
,然后检查if
语句中的参数。
set $username $1;
我必须这样做而不是直接重定向到变量的原因$1
是,该rewrite
指令本身匹配给定模式的子字符串,因此它会覆盖$[0-9]
变量。所以我不得不使用临时$username
变量来保存用户名。
您可能想做一些其他的事情,而不是return 404;
在有人进入该位置/page.php
但用户名参数的值与正则表达式不匹配的情况下。