som*_*me1 2 php nginx .htpasswd
在上一个问题中,我尝试使用带有.htpasswd和regex的Nginx密码保护我的/ admin /和子文件夹目录。
该操作已成功完成,但是现在,密码验证完成后,Nginx会提示“下载” php文件,而不是简单地加载它们。
当新位置“身份验证”块被注释掉时,不会发生这种情况。例如,在此代码示例中,PHP页面加载没有任何问题:
location / {
try_files $uri $uri/ =404;
}
#location "~^/admin/.*$" {
# try_files $uri $uri/ =404;
# auth_basic "Restricted";
# auth_basic_user_file /etc/nginx/.htpasswd;
#}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这些(显然是冲突的)位置块,所以/ admin /部分受密码保护,但php文件仍然加载?
问题是关于如何nginx处理请求的根本误解。基本上,nginx选择一个位置来处理请求。
您要nginx处理以/admin要求的位置块开头的URI auth_basic。另外,以URI结尾的URI .php必须发送到PHP7。
因此,您需要两个fastcgi块,一个用于处理普通的PHP文件,另一个用于处理受限制的PHP文件。
location指令有几种形式。您已经发现正则表达式的位置是有序的,因此您的location "~^/admin/.*$"块可以有效地阻止该location ~ \.php$块看到以开头/admin和结尾的任何URI .php。
一个干净的解决方案是使用嵌套的位置块并使用^~修饰符,该修饰符强制前缀位置优先于正则表达式位置:
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location ^~ /admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
try_files $uri $uri/ =404;
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这location ^~是前缀位置,而不是正则表达式位置。
还要注意,在块中不需要fastcgi_split_path_info和fastcgi_index指令location ~ \.php$。