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

如何通过.htaccess配置让PHP脚本处理Markdown文件

解决.htaccess配置让Markdown文件通过PHP脚本处理并展示为HTML

需求梳理

  • 所有.md文件请求通过指定PHP脚本(/home/user/public_html/src/md.php)处理
  • 浏览器地址栏URL保持不变(内部转发,非重定向)
  • 无Apache全局配置权限,仅能通过.htaccess实现
  • 需处理自定义Markdown符号,无法使用JavaScript转换器

一、.htaccess配置代码

在网站根目录的.htaccess文件中添加以下配置,实现内部转发:

RewriteEngine On

# 仅转发实际存在的.md文件请求
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.md$
RewriteRule ^(.*)$ /src/md.php?file=$1 [L]

代码解释

  • RewriteEngine On:启用Apache的URL重写模块
  • RewriteCond %{REQUEST_FILENAME} -f:仅处理服务器上真实存在的.md文件,避免转发不存在的请求
  • RewriteCond %{REQUEST_URI} \.md$:匹配所有以.md结尾的请求URL
  • RewriteRule ^(.*)$ /src/md.php?file=$1 [L]:将请求内部转发到指定PHP脚本,把原始请求路径(如docs/guide.md)作为file参数传递;[L]表示这是最后一条规则,停止后续匹配逻辑

二、PHP脚本(md.php)处理逻辑

在/home/user/public_html/src/md.php中编写处理代码,完成Markdown读取、转换和HTML输出:

<?php
// 获取请求的文件路径
$requestedFile = $_GET['file'] ?? '';

// 构建实际文件路径(网站根目录为/home/user/public_html)
$baseDir = realpath($_SERVER['DOCUMENT_ROOT']);
$actualFile = $baseDir . DIRECTORY_SEPARATOR . $requestedFile;

// 安全校验:防止目录遍历攻击,确保文件在网站根目录内且为.md文件
if (!str_starts_with($actualFile, $baseDir) || !str_ends_with($actualFile, '.md') || !is_file($actualFile)) {
    http_response_code(404);
    echo "<h1>404 未找到文件</h1>";
    exit;
}

// 读取Markdown文件内容
$mdContent = file_get_contents($actualFile);

// 自定义Markdown转换逻辑(替换成你的专属处理代码)
$htmlContent = convertCustomMarkdown($mdContent);

// 输出HTML页面
header('Content-Type: text/html; charset=utf-8');
echo <<<HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Markdown 预览</title>
    <!-- 自定义页面样式 -->
    <style>
        body { max-width: 800px; margin: 2rem auto; padding: 0 1rem; line-height: 1.6; font-family: sans-serif; }
        h1, h2, h3 { border-bottom: 1px solid #eee; padding-bottom: 0.5rem; }
        pre { background: #f5f5f5; padding: 1rem; border-radius: 4px; overflow-x: auto; }
        .highlight { background: #fff3cd; padding: 2px 4px; border-radius: 3px; }
    </style>
</head>
<body>
    $htmlContent
</body>
</html>
HTML;

// 自定义Markdown转换函数示例
function convertCustomMarkdown($md) {
    // 处理自定义符号:比如将[[高亮文本]]转换为带样式的标签
    $md = preg_replace('/\[\[(.*?)\]\]/', '<span class="highlight">$1</span>', $md);
    
    // 如需标准Markdown转换,可引入Parsedown等PHP库(自行下载后include)
    // $parser = new Parsedown();
    // return $parser->text($md);
    
    // 仅保留自定义转换逻辑时,直接返回处理后的内容
    return $md;
}
?>

注意事项

  • 若需要标准Markdown语法支持,可引入成熟PHP库(如Parsedown),只需下载后在脚本中引入并调用转换方法
  • 必须保留路径安全校验,防止恶意请求访问网站根目录外的文件

三、为什么之前的AddHandler配置无效?

你之前使用的AddHandler配置仅让Apache将.md文件当作PHP代码执行,但.md本身不是PHP脚本,因此会直接输出原始Markdown内容,无法触发自定义处理逻辑。


四、链接访问的影响说明

从HTML页面或Apache索引页的链接访问.md文件完全不受影响,因为配置是内部转发,浏览器地址栏会保持原始的.md文件URL,用户体验与直接访问文件一致。

内容的提问来源于stack exchange,提问作者yarns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:41:22