如何在该位置使用 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 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章