NGINX-url 重写正则表达式

NGINX-url 重写正则表达式

我有一个 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但用户名参数的值与正则表达式不匹配的情况下。

相关内容