我具有以下Nginx服务器配置:
server {
error_log /var/logs/error_stage.log debug;
root /var/htdocs_stage/;
index index.php index.html;
# A
location / {
try_files $uri $uri/ =404;
}
# B
location ~* \.(txt|xml|js)$ {
expires 8d;
}
# C
location /. {
deny all;
}
# D
location = /wp-config.php {
deny all;
}
# E
location ~* ^\/wp-content\/.*\.(txt|md|log)$ {
deny all;
}
}
然后我请求以下网址:
https://example.com/wp-contents/themes/demo/readme.txt
我希望此请求由位置规则E 处理,并且访问被拒绝。但是nginx实际上应用规则B ,并为文件提供8天的过期缓存!?
在error_stage.log文件中,我找到以下详细信息:
... [debug]: *1396 http uri: "/wp-contents/themes/demo/readme.txt"
...
... [debug]: *1396 generic phase: 0
... [debug]: *1396 rewrite phase: 1
... [debug]: *1396 test location: "/"
... [debug]: *1396 test location: "wp-config.php"
... [debug]: *1396 test location: ~ "\.(txt|xml|js)$"
... [debug]: *1396 using configuration "\.(txt|xml|js)$"
在这里,我注意到nginx仅测试规则A,B和D。在这三个规则中,B是正确的规则。
但是,正如您在我的nginx配置中看到的那样,还有两个甚至没有经过测试的规则...
->我的配置有什么错误?
Btw:error_stage.log文件仅由该特定服务器块使用。因此,我绝对确定,没有其他服务器块可用于处理请求。
答案 0 :(得分:1)
配置中的“错误”是正则表达式(~
)位置的顺序。
NGINX按照配置文件中出现的顺序检查正则表达式的位置。一旦找到匹配的对象,它将立即使用该位置满足请求。这就是它的工作方式。
因此,如果您仅在配置中将位置E移到位置B上方,那么E将是适用位置。