如何在该位置使用Nginx Regexp

时间:2016-12-21 11:18:35

标签: regex nginx nginx-location

Web项目将静态内容放入some / content / img文件夹中。 网址规则是:/ 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位置的错误。

2 个答案:

答案 0 :(得分:4)

在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]+)$
      ^^^^^^^^^^^^^^^^^^^^^^^^

答案 1 :(得分:4)

I got it working putting double-quotes around the location part like this:

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

the reason is that Nginx uses curly brackets to define config blocks so it thinks is opening a location block.

Source