nginx 位置正则表达式不起作用,如何启用正则表达式?

nginx 位置正则表达式不起作用,如何启用正则表达式?

在 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;
}

如果您需要帮助来计算所需的正则表达式,您可以提出另一个问题。我很少使用它们,所以每次我这样做时都需要一段时间才能恢复速度。

相关内容