需要匹配所有以 结尾的 URL commerce/authenticate
,但无法获得足够通用的规则。
以下是我需要匹配的 URL:
local.site.com/api/commerce/authenticate
local.site.com/en-us/api/commerce/authenticate
local.site.com/madrid/api/commerce/authenticate
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>
可以工作:
- local.site.com/madrid/api/commerce/authenticate
- 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