如何按条件配置auth_basic实现仅开发环境启用Nginx基础认证
解决方案
方案1:基于域名动态判断(无需修改部署流程)
利用Nginx的map指令匹配域名,动态开启/关闭身份认证,适合开发域名规则固定的场景。
- 在Nginx的http配置块中添加如下map规则:
map $host $auth_basic_realm { # 默认关闭认证(生产环境生效) default off; # 匹配开发环境域名,开启认证,可根据你的实际域名规则调整正则 ~*\.example\.com$ "Restricted Content"; } # 可选:避免生产环境因不存在.htpasswd文件报错 map $host $auth_basic_file { default ""; ~*\.example\.com$ "/var/www/html/public/.htpasswd"; }
- 修改你的server配置,把认证规则放到server块下(避免PHP请求绕过认证):
server { root /var/www/html/public; index index.php; # 全局生效的认证规则,所有location都会继承 auth_basic $auth_basic_realm; auth_basic_user_file $auth_basic_file; location / { try_files $uri $uri/ /index.php?$args; } location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_pass php-upstream; fastcgi_index index.php; } }
注意:map指令只能放在http块中,不能放在server或location块内。
方案2:基于CI/CD环境变量控制(更灵活,不依赖域名)
你已经在使用Docker+CI/CD部署,可以通过部署流程区分环境,仅在开发环境注入认证配置,生产环境完全不加载相关规则。
- 将你的Nginx配置改为模板文件,用占位符替换认证相关配置:
server { root /var/www/html/public; index index.php; # {AUTH_BASIC_CONFIG} 占位符,部署时动态替换 location / { try_files $uri $uri/ /index.php?$args; } location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_pass php-upstream; fastcgi_index index.php; } }
- 在CI/CD流程中添加判断逻辑:
- 部署到开发环境时,将占位符替换为:
auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/public/.htpasswd;
- 部署到生产环境时,将占位符替换为空内容即可。
如果使用官方Nginx Docker镜像,可以直接利用其内置的envsubst模板替换能力:将模板文件命名为*.conf.template放到/etc/nginx/templates目录下,启动容器时传入环境变量即可自动生成配置。
重要提醒
原来的配置将认证规则放在location /中,会导致直接访问.php后缀的请求绕过认证(Nginx正则location优先级高于前缀location),所以推荐将认证规则放在server块全局生效,避免出现安全漏洞。
内容的提问来源于stack exchange,提问作者sfarzoso
相关产品推荐
相关产品推荐

