# ============================================================ # 宝塔站点 api.yunzer.cn 的 nginx 配置(留档副本) # 文件位置(服务器):/www/server/panel/vhost/nginx/api.yunzer.cn.conf # 面板入口:宝塔 → 网站 → api.yunzer.cn → 设置 → 配置文件 # # 【2026-10-31 新增】根路径域名校验文件的 http 放行 # 微信公众平台 / 小程序配置「业务域名」时,校验服务是走 **http** # 去抓取根目录下的校验文件(如 /1XXl8fPHr9.txt)。 # 原配置把 http 一律 301 到 https,微信拿到重定向就判 # 「校验文件验证失败,请确认已在域名根目录正确放置校验文件」。 # 下面 HTTP_TO_HTTPS 块里新增的 if 例外,就是让根路径下的 .txt # 校验文件在 http 下直接返回文件内容(不跳转)。 # 用通配而不是写死文件名:微信每次重新下载校验文件都会生成新随机名。 # # 【注意】不要设 verify_hosts # 本文件里 proxy_set_header Host 10.31.100.2; 把 Host 头改成了 IP, # Go 侧看不到 api.yunzer.cn 这个域名。verify_hosts 必须留空 # (留空 = 所有走本服务的域名都放行)。 # # 【注意】location ^~ / 会让后面的正则 location 失效 # ^~ 匹配后 nginx 不再检查正则 location,所以下面两条 # 「禁止访问的敏感文件 / 敏感目录」的 location ~* 规则在本站点实际不生效。 # 当前无泄露风险(Go 不提供工作目录文件,未知路径一律 404),但要知道这层保护是空的。 # # 【注意】proxy_cache_path 定义了缓存区但当前未启用 proxy_cache # 以后若启用全局缓存,301 会被缓存住,微信可能拿到缓存的旧响应,届时需清缓存。 # ============================================================ proxy_cache_path /www/wwwroot/api.yunzer.cn/proxy_cache_dir levels=1:2 keys_zone=api_yunzer_cn_cache:20m inactive=1d max_size=5g; server { listen 80; listen 443 ssl; http2 on; listen [::]:80; server_name api.yunzer.cn; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/api.yunzer.cn; include /www/server/panel/vhost/nginx/extension/api.yunzer.cn/*.conf; #CERT-APPLY-CHECK--START # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除 include /www/server/panel/vhost/nginx/well-known/api.yunzer.cn.conf; #CERT-APPLY-CHECK--END #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; #HTTP_TO_HTTPS_START set $isRedcert 1; if ($server_port != 443) { set $isRedcert 2; } if ( $uri ~ /\.well-known/ ) { set $isRedcert 1; } # 域名校验文件(微信/搜索引擎/第三方平台)必须能用 http 直接访问,不能 301 跳 https。 # 用 [.] 代替 \. ,避免 nginx 配置解析里反斜杠转义的歧义。 if ( $uri ~ ^/[A-Za-z0-9._-]+[.]txt$ ) { set $isRedcert 1; } if ($isRedcert != 1) { rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END ssl_certificate /www/server/panel/vhost/cert/api.yunzer.cn/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/api.yunzer.cn/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_tickets on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END #REDIRECT START #REDIRECT END #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END #PHP-INFO-START PHP引用配置,可以注释或修改 include enable-php-00.conf; #PHP-INFO-END #IP-RESTRICT-START 限制访问ip的配置,IP黑白名单 #IP-RESTRICT-END #BASICAUTH START #BASICAUTH END #SUB_FILTER START #SUB_FILTER END #GZIP START #GZIP END #GLOBAL-CACHE START #GLOBAL-CACHE END #WEBSOCKET-SUPPORT START proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; #WEBSOCKET-SUPPORT END #PROXY-CONF-START location ^~ / { proxy_pass http://10.31.100.2:9000; proxy_set_header Host 10.31.100.2; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-Port $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header REMOTE-HOST $remote_addr; # 连接超时(建立连接的时间) proxy_connect_timeout 3600s; # 发送超时(发送请求到后端的时间) proxy_send_timeout 3600s; # 读取超时(等待后端响应的时间) proxy_read_timeout 3600s; # 支持websocket链接 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # 客户端请求体大小限制(0 表示不限制) client_max_body_size 0; # 客户端请求体超时(客户端发送请求体的时间) client_body_timeout 3600s; # 客户端请求体缓冲区大小 client_body_buffer_size 128k; # 禁用请求体缓冲(直接流式传输到后端,不先缓存到磁盘) proxy_request_buffering off; # 禁用响应缓冲(直接流式传输到客户端) proxy_buffering off; } #PROXY-CONF-END #SERVER-BLOCK START #SERVER-BLOCK END # 禁止访问的敏感文件 location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$ { return 404; } # 禁止访问的敏感目录 location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ { return 404; } #一键申请SSL证书验证目录相关设置 location /.well-known { allow all; } #禁止在证书验证目录放入敏感文件 if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { return 403; } #LOG START access_log /www/wwwlogs/api.yunzer.cn.log; error_log /www/wwwlogs/api.yunzer.cn.error.log; #LOG END }