nginx:auth_basic和php

Big*_*gie 9 php authentication nginx

我想用auth_basic用密码保护我网站的文件夹.此文件夹包含php脚本,如果请求它们应该执行.

我尝试了以下方法:

location /admin {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
 }

 location ~ ^/admin/.*\.php$ {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include   fastcgi_params;
 }
Run Code Online (Sandbox Code Playgroud)

在请求该admin文件夹中的php脚本时,我将被要求输入用户名/密码,但是php脚本将始终被下载而不是通过fastcgi执行.

我究竟做错了什么?

编辑:在我的本地机器上一切正常,使用此配置.o0
编辑:BTW,php正在admin-folder之外使用相同的fastcgi-options.
编辑:天啊!该站点的配置存储在/ etc/nginx/sites-available/mysite和/ etc/nginx/sites-enabled /包含mysite文件的符号链接.因为有些时候改变mysite文件没有效果.例如,将所有位置更改为"全部拒绝"都没有效果.文件发送没有问题.
所以我删除了符号链接并重新启动了服务器.然后我再次创建了符号链接,重新启动了服务器,一切都按预期工作.有人可以解释奇怪的行为吗?

Gest问候,
Biggie

fis*_*est 12

有了这个配置,nginx的将只匹配一个两个块-一个具有最高优先级.

解决方案是将PHP块组合 AUTH块中.这是nginx作者自己推荐的方法,Igor Sysoev.

location /admin/ {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
  location ~ \.php$ {
   fastcgi_pass  127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include       fastcgi_params;
  }
}

location ~ \.php$ {
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include       fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这就是 nginx 的工作原理,但这已经让我厌烦了很多次,不再有趣了。我确实需要重新包含我想要改变某些行为的每个位置块中的所有内容。即使使用大量片段文件,这确实很痛苦。一个小错误和一些“auth_basic”或“deny”指令可能无法以意想不到的方式应用(因为正则表达式匹配可能优先于前缀匹配)。非常容易出错。 (2认同)

小智 -1

您需要删除以下行:

fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
Run Code Online (Sandbox Code Playgroud)

  • 当 php-fpm 在 chroot 监狱中运行时,这是必要的一行。 (3认同)