如何通过.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结尾的请求URLRewriteRule ^(.*)$ /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
相关产品推荐
相关产品推荐

