需显式配置 location ^~ /.well-known/ 并置于其他 location 前,配合 root 正确指向、try_files $uri =404 和禁止脚本执行,以确保 acme 等验证文件可被直接访问。

要在 Nginx 的网站根路径下正确提供 .well-known 验证文件(比如 Let's Encrypt 的 ACME HTTP-01 挑战、Apple 的关联文件或 Android 的数字资产链接),关键不是把文件“放对位置”,而是让 Nginx **明确允许访问以 .well-known 开头的路径**,并确保该路径不被其他规则(如 PHP 处理、重定向或 deny 规则)拦截。
确保 root 指令指向正确目录
确认你的 server 块中已设置 root,且该目录下存在 .well-known 子目录。例如:
对应配置应为:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
...
}
显式配置 .well-known 路径的 location 块
Nginx 默认可能拒绝以点开头的隐藏路径(取决于安全策略或发行版默认配置)。必须用 location ^~ /.well-known/ 显式放行,并禁止进一步重写或代理:
- 使用
^~前缀确保前缀匹配优先级高于正则匹配 - 添加
try_files $uri =404;直接返回静态文件,避免被 PHP 或 rewrite 规则干扰 - 禁用日志(可选)和限制方法(如只允许 GET/HEAD)可增强安全性
示例配置片段:
location ^~ /.well-known/ {
allow all;
try_files $uri =404;
# 可选:禁止执行脚本
location ~ \.(php|pl|py|jsp|asp|sh|cgi)$ {
deny all;
}
}
检查是否有冲突的 location 或 rewrite 规则
常见问题来源:
- 全局或 server 级别的
location ~ /\. { deny all; }会直接屏蔽.well-known - 类似
location / { try_files $uri $uri/ /index.php?$query_string; }的兜底规则,可能把/.well-known/...错误转发给后端 - HTTPS 强制跳转规则(如
return 301 https://...)在 80 端口配置中若未排除.well-known,会导致 ACME 挑战失败
解决方法:将 /.well-known/ location 块放在所有泛匹配 location(如 / 或 ~ \.php$)之前,利用 Nginx location 匹配顺序优先级。
验证是否生效
完成配置后,执行以下步骤验证:
- 运行
nginx -t确保语法正确 - 重载配置:
nginx -s reload - 在服务器上创建测试文件:
mkdir -p /var/www/example.com/.well-known/test && echo "ok" > /var/www/example.com/.well-known/test/hello - 从外部访问:
curl -I http://example.com/.well-known/test/hello,应返回200 OK - 检查响应头中是否有意外的
X-Powered-By或重定向










