直接改后缀为.php无法渲染markdown,需用解析器如parsedown读取.md文件并转html;禁止将markdown硬写入.php或用eval()执行,应分离数据(.md)、逻辑(.php)和模板。

直接改后缀会导致 PHP 代码不执行
把 README.md 改成 README.php 后,浏览器访问时通常只会原样输出 Markdown 源码,而不是渲染成 HTML —— 因为 PHP 解释器默认不会处理 Markdown 语法,它只执行 <?php ?> 包裹的代码。你看到的是一堆 # 标题、- 列表,不是网页。
想让 .php 文件渲染 Markdown,得用解析器
常见做法是:保留 .php 后缀,但在文件里引入 Markdown 解析库,读取原始 Markdown 内容(可以是内联字符串、文件或数据库字段),再输出 HTML。
- 推荐轻量库:
erusev/parsedown(无依赖,单文件,支持 GitHub 风格) - 安装:
composer require erusev/parsedown - 基础用法示例:
<?php
require_once 'vendor/autoload.php';
$parser = new Parsedown();
$markdown = file_get_contents('content.md'); // 或写死在变量里
echo $parser->text($markdown);
?>注意:content.md 仍可保持 .md 后缀,只是被 PHP 读取并转换 —— 不必强求“一个文件两种角色”。
别硬塞 Markdown 到 .php 里当模板用
有人会把整个 Markdown 文本直接写进 .php 文件,靠字符串拼接 + eval() 或 include() 去“运行”,这既不安全也不合理:
立即学习“PHP免费学习笔记(深入)”;
-
eval()执行任意文本 = 远程代码执行风险 - Markdown 本身不是 PHP 语法,
include('doc.md')会报ParseError - 混写导致 IDE 无法语法高亮,Git diff 失去语义,协作成本陡增
真正合理的分层是:数据(.md) + 逻辑(.php) + 模板(可选 .html/.php 片段)。
Apache/Nginx 配置影响不大,但别忽略 MIME 类型
服务器不会因为你改了后缀就自动识别内容类型。如果手动访问 doc.php 却看到下载或乱码,检查响应头:
- 确保 PHP 输出前没开启
Content-Type为text/plain或未设置 - 加一句
header('Content-Type: text/html; charset=utf-8');最保险 - Nginx/Apache 对
.php后缀的处理是统一的,无需额外配置 Markdown 相关规则
最常被忽略的是:PHP 输出前有空格、BOM 或 echo 了调试信息,导致 header 已发送,后续 header() 失效 —— 这会让浏览器误判内容类型。











