NGINX – url重写正则expression式

我有像example.com/page.php?username=test这样的url。 我想重写这个url到像这样的: example.com/test只有当test遵循下面的正则expression式: /^[0-9a-zA-Z_-]{1,35}+$/ ,否则404页面。

这应该工作:

  location /page.php { if ($args ~ "^username=([0-9a-zA-Z_-]{1,35})$") { set $username $1; rewrite . /$username last; } return 404; } 

诀窍是在Nginx的location指令中匹配variables$uri ,根据文档,这个variables不包含任何get参数。 所以实现你的目标的唯一方法是首先匹配uri /page.php ,然后在if语句中检查参数。

之所以我不得不做set $username $1; 而不是直接redirect到variables$1而是rewrite指令本身匹配给定模式的子string,所以它覆盖了$[0-9]variables。 所以我不得不使用临时的$usernamevariables来保持用户名。

你可能想要做的事情比return 404; 在有人进入location / /page.php的情况下,但是username参数的值与正则expression式不匹配。