Laravel+Nginx配置Basic Auth时如何设置/api等路由免除验证?
问题原因分析
- 路由重写后验证规则继承:
/api开头的请求匹配到第一个location块时已经关闭了身份验证,但经过try_files重写到index.php后,请求会重新匹配到.php后缀的location块,该块继承了全局开启的auth_basic规则,依然会触发身份验证。 - 验证配置不配对:全局作用域开启了
auth_basic但未配置对应的auth_basic_user_file,仅在php处理块中配置了验证文件,导致Nginx验证逻辑异常,出现输入正确账号也反复弹出验证框的问题。
修复后的完整配置
auth_basic "My DEMO"; # 全局统一配置验证文件,和auth_basic配对 auth_basic_user_file /etc/nginx/auth/.htpasswd; location ~ ^/(api|public|images)/.* { auth_basic off; try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { # 针对/api开头的请求关闭身份验证 if ($request_uri ~ ^/api/) { set $auth_basic off; } auth_basic $auth_basic; add_header X-Dovesono-php 1; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; }
配置修改说明
- 将原本仅存在于php块中的
auth_basic_user_file提升到全局server作用域,和全局的auth_basic配置配对,解决验证逻辑混乱的问题。 - 在php处理块中增加请求路径判断,只要原始请求路径是
/api开头,就直接关闭身份验证,避免重写后的php请求重复触发验证。
生效步骤
- 执行
nginx -t测试配置语法是否正确,提示syntax is ok、test is successful再进行下一步。 - 执行
systemctl reload nginx重载Nginx配置即可生效。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

