You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件配置auth_basic实现仅开发环境启用Nginx基础认证

解决方案

方案1:基于域名动态判断(无需修改部署流程)

利用Nginx的map指令匹配域名,动态开启/关闭身份认证,适合开发域名规则固定的场景。

  1. 在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";
}
  1. 修改你的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部署,可以通过部署流程区分环境,仅在开发环境注入认证配置,生产环境完全不加载相关规则。

  1. 将你的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;
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:39:03