我尝试使用Nginx自带的基本HTTP身份validation来确保几个位置的安全,但由于某些原因,它不起作用。
我有:
website.com/admin(用户ADMIN可访问)website.com/admin/secret.php(只能由用户SECRET访问)
我曾经在Lighttpd中工作过:
"/admin/secret.php" => ( "method" => "basic", "realm" => "Server Administrator", "require" => "user=SECRET" ), "/admin" => ( "method" => "basic", "realm" => "Administrators", "require" => "user=ADMIN" )
任何想法如何可以转换为Nginx。 我已经尝试了以下,但只有ADMIN会要求input密码:
location /admin/secret.php { auth_basic "Restricted"; auth_basic_user_file /home/passwords/SECRET; try_files $uri = 404; fastcgi_pass localhost:9000; } location ^~ /admin/.+\.php$ { auth_basic "Restricted"; auth_basic_user_file /home/passwords/ADMIN; try_files $uri = 404; fastcgi_pass localhost:9000; }
处理位置的Nginx规则如下:枚举所有普通的位置并find最精确的匹配(Nginxsorting所有普通位置来优化这一步)。 之后,Nginx按照外观顺序运行所有“正则expression式”位置。 如果任何“正则expression式”位置成功,Nginx将使用此第一个匹配。 如果没有“regexp”位置成功,Nginx会使用上一步find的普通位置。
在你的情况下,由于“正则expression式”的位置优先于“前缀”的位置,这就是为什么你select/admin/.+\.php$处理请求/admin/secret.php 。
可以禁止使用^~修饰符search正则expression式位置,或使用=修饰符指定完全匹配:
location = /admin/secret.php { ...
注意我刚刚注意到你的问题中的configuration片段是错误的 – 你在正则expression式的前面,应该是。 你应该拥有的是:
location = /admin/secret.php { location ~ ^/admin/.+\.php$ {