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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:09