Apache下.htaccess适配Certbot ACME挑战的Rewrite规则问题
解决ACME挑战的Apache .htaccess规则问题
核心问题分析
你第二个规则出现404的原因很直接:在.htaccess文件中,RewriteRule的匹配模式是相对路径(去掉当前目录前缀后的路径),不能以/开头。带/的模式会完全匹配不到请求路径,自然返回404。
修正后的.htaccess规则
下面的规则既能正确匹配ACME挑战请求,又能将验证字符串提取并转发到指定PHP页面:
<IfModule mod_rewrite.c> RewriteEngine On # 匹配ACME挑战路径,提取验证字符串并转发到PHP页面 RewriteRule ^.well-known/acme-challenge/([a-zA-Z0-9\-_]+)$ wp/acme-challenge.php?token=$1 [L] </IfModule>
规则说明:
- 去掉了开头的
/,适配.htaccess的相对路径匹配逻辑 - 用
([a-zA-Z0-9\-_]+)精准提取Let's Encrypt的验证字符串(这类字符串仅包含字母、数字、下划线和连字符) - 通过
tokenGET参数将验证字符串传递给wp/acme-challenge.php - 使用
[L]标记终止后续规则处理,避免冲突
PHP页面处理逻辑
在wp/acme-challenge.php中,你需要读取并返回对应验证字符串的授权内容,示例代码如下:
<?php $token = $_GET['token'] ?? ''; // 读取Certbot生成的挑战文件(假设文件存放在wp目录下的对应路径) $challengeFilePath = __DIR__ . '/.well-known/acme-challenge/' . $token; if (file_exists($challengeFilePath)) { // 返回挑战文件的内容,满足Certbot的验证要求 echo file_get_contents($challengeFilePath); exit; } // 未找到对应验证内容时返回404 http_response_code(404); echo 'Challenge not found'; ?>
额外提示
- 如果你之前用
R=277是想做重定向,其实没必要:内部转发(上面的规则不带R标记)更高效,Certbot仅需要获取响应内容,不需要跳转 - 确保
wp/.well-known/acme-challenge/目录有可读权限,Certbot生成挑战文件后,PHP才能正常读取
内容的提问来源于stack exchange,提问作者jacek
相关产品推荐
相关产品推荐

