Nginx 位置按后缀匹配

Nginx 位置按后缀匹配

需要匹配所有以 结尾的 URL commerce/authenticate,但无法获得足够通用的规则。

以下是我需要匹配的 URL:

  1. local.site.com/api/commerce/authenticate

  2. local.site.com/en-us/api/commerce/authenticate

  3. local.site.com/madrid/api/commerce/authenticate

  4. local.site.com/madrid/en-us/api/commerce/authenticate

我的尝试:

      # <My attempt>
      location ~ .*api/commerce/authenticate {
        limit_except POST {
          deny all;
        }
      }

     # This also exists <madrid-path>
     location ^~ /madrid {
       try_files $uri $uri/ /madrid/index.php?$query_string;
       location ~ '\.php$|^/update.php' {
         fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
         ...
       }         
     }

上述代码不起作用(匹配所有给定的 URL),但如果我移动<My attempt>它就<madrid-path>可以工作:

  1. local.site.com/madrid/api/commerce/authenticate
  2. local.site.com/madrid/en-us/api/commerce/authenticate`

但正如我上面解释的那样,我需要一个同样适用于根案例的通用规则。

答案1

^在检查该位置后,中的字符会location ^~ /madrid阻止 nginx 检查正则表达式。

尝试以下配置:

location ~ api/commerce/authenticate$ {
    limit_except POST {
        deny all;
    }
}

location /madrid {
    try_files $uri $uri/ /madrid/index.php?$query_string;
    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        ...
    }
}

有了此配置和请求/madrid/api/commerce/authenticate,nginx 首先看到前缀与匹配/madrid。它会记住匹配,然后继续检查正则表达式块。然后正则表达式块匹配,nginx 将使用它。

如果正则表达式块不匹配,nginx 将使用该/madrid位置。

有关 nginx 位置处理规则的更多详细信息,请参阅http://nginx.org/en/docs/http/ngx_http_core_module.html#location

相关内容