如何在该位置使用 Nginx 正则表达式

Posted

技术标签:

【中文标题】如何在该位置使用 Nginx 正则表达式【英文标题】:How to use Nginx Regexp in the location 【发布时间】:2017-05-06 19:20:00 【问题描述】:

Web 项目在 /content/img 文件夹中有静态内容。 url 规则是:/img/some md5 但在文件夹中的位置:/content/img/前两位数/

例子

url:      example.com/img/fe5afe0482195afff9390692a6cc23e1
location: /www/myproject/content/img/fe/fe5afe0482195afff9390692a6cc23e1

这个 nginx 位置是正确的,但很多不安全(符号点在正则表达式中不好):

        location ~ /img/(..)(.+)$ 
               alias $project_home/content/img/$1/$1$2;
               add_header Content-Type image/jpg;
         

下一个位置更正确,但不起作用:

        location ~ /img/([0-9a-f]\2\)([0-9a-f]+)$ 
               alias $project_home/content/img/$1/$1$2;
               add_header Content-Type image/jpg;
         

帮我找出错误以获得更正确的 nginx 位置。

【问题讨论】:

试试/img/([0-9a-fA-F]2)([0-9a-fA-F]+)$(见this demo)。 【参考方案1】:

在 POSIX BRE 模式中转义限制量词中的大括号是必要的,并且 NGINX 不使用这种正则表达式风格。在这里,你不应该逃避限制量词大括号,但你需要告诉 NGINX 你将大括号作为正则表达式模式字符串的一部分传递。

因此,您需要用双引号将整个模式括起来:

使用

location ~ "/img/([0-9a-fA-F]2)([0-9a-fA-F]+)$"

这是regex demo。

请注意,在当前场景中,您可以重复子模式:

 /img/([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]+)$
      ^^^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

HTTP/1.1 502 网关错误 位置 ~ /img/([0-9a-fA-F]\2\)([0-9a-fA-F]+)$ echo $1;回声 $2; 限制限定符在这种环境中起作用。只需用双引号将位置部分括起来。否则 Nginx 的配置解析器会因为 打开一个位置块或者是一个限制性限定符而遇到麻烦。所以我认为@Ricardo 的回答非常有用,应该被接受。【参考方案2】:

我让它在 location 部分周围加上双引号,如下所示:

location ~ "/img/([0-9a-f]2)([0-9a-f]+)$"

原因是 Nginx 使用花括号来定义配置块,所以它认为是打开一个位置块。

Source

【讨论】:

以上是关于如何在该位置使用 Nginx 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

一个规则正则表达式的 nginx 多个位置

Nginx服务的跳转Rewrite正则表达式

Nginx位置正则表达式来处理/ sub /目录中多个WordPress站点的永久链接

Nginx的正则表达式locationrewrite

Nginx中的正则如何匹配数字

Nginx try_files 不工作正则表达式