在 nginx 配置中,我只想使用正则表达式来定位,但我无法让任何正则表达式起作用。
使用位置路径中的纯字符串,它就可以工作,我可以从浏览器访问该文件。以下是我的配置:
location /profile/491ecdcd4.png {
root /srv/www/XXX/code/app/public;
}
但我想指定所有 png 文件的文件夹,所以我想通过正则表达式来执行此操作。但是,一旦我切换到正则表达式,~*
我就无法再让它工作了。以下方法都不起作用:
location ~* ^/profile/.*\.png$ { # The regex like I would want it
location ~* /profile/491ecdcd4\.png$ { # File name and line end
location ~* \/profile\/491ecdcd4\.png$ { # Slashes escaped
location ~* "\/profile\/491ecdcd4\.png$" { # Quotes around the regex
location ~* profile { # Just plain the path
如果我指定这样的位置,当我尝试在浏览器中访问 png 时会出现 404 错误。~
而不是~*
也不起作用。
整个配置如下(缩短):
server {
listen 443 ssl;
server_name XXX;
ssl on;
ssl_certificate /srv/www/XXX/certs/cacert.chain.pem;
ssl_certificate_key /srv/www/XXX/certs/privkey.pem;
# Special treatment and the problematic section
location ~* /profile/491ecdcd4.png {
root /srv/www/XXX/code/app/public;
}
# For the rest
location / {
root /srv/www/XXX/code/app/build;
}
}
```
有任何想法吗?
nginx 版本:nginx/1.6.2
编辑:为了更清楚起见,我编辑了答案。
答案1
你应该读一下“了解 Nginx 位置块选择“,特别是这部分
location optional_modifier location_match { . . . }
上面的 location_match 定义了 Nginx 应该根据什么来检查请求 URI。上例中修饰符的存在与否会影响 Nginx 尝试匹配 location 块的方式。下面的修饰符将导致关联的 location 块被解释如下:
- (无):如果没有修饰符,则位置将被解释为前缀匹配。这意味着给定的位置将与请求 URI 的开头进行匹配以确定匹配。
- =:如果使用等号,则当请求 URI 与给定的位置完全匹配时,该块将被视为匹配。
- ~:如果存在波浪号修饰符,则该位置将被解释为区分大小写的正则表达式匹配。
- ~*:如果使用波浪号和星号修饰符,则位置块将被解释为不区分大小写的正则表达式匹配。
- ^~:如果存在插入符号和波浪号修饰符,并且如果该块被选为最佳非正则表达式匹配,则不会进行正则表达式匹配。
简而言之,您使用的是前缀匹配,因为您没有 ~ 字符。修复此问题后,我在这里看不到任何正则表达式。下面是一个我用于缓存图像的正则表达式的位置作为示例
location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
expires 8d;
}
如果您需要帮助来计算所需的正则表达式,您可以提出另一个问题。我很少使用它们,所以每次我这样做时都需要一段时间才能恢复速度。