我想阻止对特定文件夹的访问。
www.example.com/user/login
Here is my nginx vhost:
server {
listen 80;
root /var/www/example.com;
index index.php;
server_name example.com;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
if (!-e $request_filename) {
rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
rewrite ^/(.*)$ /index.php?a=$1 last;
break;
}
if ($request_uri ~ "/index.(php|html?)") {
rewrite ^ /$1 permanent;
}
location / {
try_files $uri $uri/ /index.php;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff)$ {
expires 365d;
}
location /user/login {
deny all;
}
location ~ (\.sql.gz|\.sql) { return 403; }
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php7-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
server {
listen 80;
server_name www.example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
我仍然可以访问该文件夹。(是的,我 nginx -s reload
每次尝试后都会重新启动 nginx)。
代替:
location /user/login {
deny all;
}
我还尝试了以下指令:
location = /user/login {
deny all;
}
location ^~ /user/login {
deny all;
}
但它们都没有阻止对该文件夹的访问。
有人能帮忙发现这个问题吗?
答案1
替换此块
if (!-e $request_filename) {
rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
rewrite ^/(.*)$ /index.php?a=$1 last;
break;
}
和这个块
location / {
try_files $uri $uri/ /index.php;
}
和
location ~ /(?<path>.*)$ {
index index.php;
try_files $uri $uri/ /index.php?a=$path;
}
location ~ /admin/(?<path>.*)$ {
index index.php;
try_files $uri $uri/ /admin/index.php?a=$path;
}
try_files
是nginx原生实现前端控制器模式的方式,这两个块的功能和块中的语句location
一样。rewrite
if
此外,它们解决了您遇到的问题,因为 nginx 通常的location
匹配顺序不会受到该if
条件的干扰。
答案2
您的问题出在您的 nginx 配置的以下部分:
if (!-e $request_filename) {
rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
rewrite ^/(.*)$ /index.php?a=$1 last;
break;
}
因为这个条件在你访问example.com/user/login
nginx 时为真,输入的是 if 块内的语句,而不是块内的语句location /user/login
因此,为了解决您的问题,请完全删除此 if 语句或将其放入另一个位置块中。