nginx 简单拒绝规则未强制执行
nginx simple deny rule not enforced
我有点不好意思用这么简单的问题打扰你,但我不明白为什么 nginx 的配置没有对子文件夹强制执行简单的拒绝规则,真的希望你能把我推向明显的错误.
所以,设置:我有一个 nginx 网络服务器 运行,/var/www
是根目录,还有一些子文件夹。 SSL 是强制执行的,因为我正在使用 baikal CalDAV/CardDAV 来自相应文档的 fastcgi 设置。这是当前工作的配置文件:
server {
listen 443 ssl;
root /var/www;
index index.html index.htm index.php;
server_name mydomain.org;
ssl_certificate /path/to/nginx.crt;
ssl_certificate_key /path/to/nginx.key;
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
allow ::1;
deny all;
}
location ~ ^(.+\.php)(.*)$ {
try_files $fastcgi_script_name =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include /etc/nginx/fastcgi_params;
}
rewrite ^/.well-known/caldav /baikal/cal.php redirect;
rewrite ^/.well-known/carddav /baikal/card.php redirect;
charset utf-8;
location ~ /(\.ht|Core|Specific) {
deny all;
return 404;
}
}
现在,我只想限制对名为 /my/data/
的子子文件夹的访问,我首先将其添加到拒绝块中,如下所示:
location ~ /(\.ht|Core|Specific|my/data/) {
deny all;
return 404;
}
但这没有成功,所以我定义了一个自己的位置,如:
location ~ /my/data {
deny all;
return 404;
}
尝试过使用和不使用尾部斜杠,使用和不使用 ~
就像 /doc/
中那样,以及将拒绝位置块放在任何其他块之前,现在我不知所措。仍然授予对 /my/data
和所有子文件夹和文件的访问权限。谁能帮帮我?
感谢阅读!
如果您使用带正则表达式的位置,则位置顺序很重要,因为按顺序检查正则表达式给出的位置,首先匹配的为准。也就是这样的配置:
location ~ \.php$ { fastcgi_pass ... }
location ~ /my/data { deny all; }
将始终允许访问任何 .php
文件,甚至匹配 /my/data
。要解决此问题,您必须保持正确的位置顺序,即首先保持 location ~ /my/data
:
location ~ /my/data { deny all; }
location ~ \.php$ { fastcgi_pass ... }
或者,更好的是,使用带有 ^~
修饰符的前缀位置 - 在这种情况下,顺序并不重要。这也确保将使用正确的前缀匹配,并且根本不会检查正则表达式。例如:
location ~ \.php$ { fastcgi_pass ... }
location ^~ /my/data { deny all; }
有关 nginx 中位置匹配的更多详细信息,请参阅 http://nginx.org/r/location。
请注意,如果您使用 deny all
,则配置中的 return 404
是多余的,反之亦然。只需使用其中一个指令。
同样重要的是要注意,在测试时,你不应该依赖你的浏览器。由于缓存,使用浏览器进行测试通常会导致混乱的结果。最好使用例如 curl
.
我有点不好意思用这么简单的问题打扰你,但我不明白为什么 nginx 的配置没有对子文件夹强制执行简单的拒绝规则,真的希望你能把我推向明显的错误.
所以,设置:我有一个 nginx 网络服务器 运行,/var/www
是根目录,还有一些子文件夹。 SSL 是强制执行的,因为我正在使用 baikal CalDAV/CardDAV 来自相应文档的 fastcgi 设置。这是当前工作的配置文件:
server {
listen 443 ssl;
root /var/www;
index index.html index.htm index.php;
server_name mydomain.org;
ssl_certificate /path/to/nginx.crt;
ssl_certificate_key /path/to/nginx.key;
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
allow ::1;
deny all;
}
location ~ ^(.+\.php)(.*)$ {
try_files $fastcgi_script_name =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include /etc/nginx/fastcgi_params;
}
rewrite ^/.well-known/caldav /baikal/cal.php redirect;
rewrite ^/.well-known/carddav /baikal/card.php redirect;
charset utf-8;
location ~ /(\.ht|Core|Specific) {
deny all;
return 404;
}
}
现在,我只想限制对名为 /my/data/
的子子文件夹的访问,我首先将其添加到拒绝块中,如下所示:
location ~ /(\.ht|Core|Specific|my/data/) {
deny all;
return 404;
}
但这没有成功,所以我定义了一个自己的位置,如:
location ~ /my/data {
deny all;
return 404;
}
尝试过使用和不使用尾部斜杠,使用和不使用 ~
就像 /doc/
中那样,以及将拒绝位置块放在任何其他块之前,现在我不知所措。仍然授予对 /my/data
和所有子文件夹和文件的访问权限。谁能帮帮我?
感谢阅读!
如果您使用带正则表达式的位置,则位置顺序很重要,因为按顺序检查正则表达式给出的位置,首先匹配的为准。也就是这样的配置:
location ~ \.php$ { fastcgi_pass ... }
location ~ /my/data { deny all; }
将始终允许访问任何 .php
文件,甚至匹配 /my/data
。要解决此问题,您必须保持正确的位置顺序,即首先保持 location ~ /my/data
:
location ~ /my/data { deny all; }
location ~ \.php$ { fastcgi_pass ... }
或者,更好的是,使用带有 ^~
修饰符的前缀位置 - 在这种情况下,顺序并不重要。这也确保将使用正确的前缀匹配,并且根本不会检查正则表达式。例如:
location ~ \.php$ { fastcgi_pass ... }
location ^~ /my/data { deny all; }
有关 nginx 中位置匹配的更多详细信息,请参阅 http://nginx.org/r/location。
请注意,如果您使用 deny all
,则配置中的 return 404
是多余的,反之亦然。只需使用其中一个指令。
同样重要的是要注意,在测试时,你不应该依赖你的浏览器。由于缓存,使用浏览器进行测试通常会导致混乱的结果。最好使用例如 curl
.