如何通过PHP模板加载自定义页面(仅维护TXT文件)
用单一PHP模板加载所有TXT内容的实现方案
我来帮你搞定这个冗余问题!你的思路完全正确——通过GET请求传递TXT文件路径给通用模板,就能彻底淘汰那些重复的PHP文件,只维护TXT内容即可。下面一步步教你具体实现:
1. 重构内容链接:指向模板并传递TXT路径
原来你是给每个内容写单独的PHP文件,现在把所有内容链接都改成指向你的通用模板文件(比如命名为template.php),通过?file=参数传递对应的TXT文件路径。
举个例子:
- 原来的链接:
<a href="./content/006wakeWeRide.php">The Wake We Ride</a> - 现在改成:
<a href="template.php?file=contentTxt/006wakeWeRide.txt">The Wake We Ride</a>
如果内容很多不想手动改,后面我会教你自动生成这个列表的方法。
2. 编写通用模板文件(template.php)
这是核心部分,负责接收GET参数、读取TXT文件、解析内容并渲染HTML。
第一步:安全获取并校验TXT文件路径
一定要加安全校验! 防止恶意用户通过目录遍历访问服务器上的其他文件:
<?php // 获取传入的TXT文件路径,可设置默认文件(比如首页内容) $txtFile = $_GET['file'] ?? 'contentTxt/default.txt'; // 限制只能访问contentTxt目录下的文件 $allowedDir = realpath('contentTxt'); $targetFile = realpath($txtFile); // 校验文件是否在允许的目录内,且是txt文件 if (!$targetFile || strpos($targetFile, $allowedDir) !== 0 || pathinfo($targetFile, PATHINFO_EXTENSION) !== 'txt') { die("无效的内容请求!"); } // 读取TXT文件内容,忽略换行符更方便处理 $myContent = file($targetFile, FILE_IGNORE_NEW_LINES); ?>
第二步:解析TXT头部和正文
根据你给出的TXT格式,提取头部信息和正文内容:
<?php // 解析TXT头部字段 $contentType = $myContent[0] ?? 'txt'; $title = $myContent[1] ?? '未命名内容'; $author = $myContent[2] ?? '匿名作者'; $date = $myContent[3] ?? '未知日期'; $thumbnail = $myContent[4] ?? ''; // 提取正文:从第7行开始(对应数组索引6,因为数组从0计数) $bodyParagraphs = array_slice($myContent, 6); ?>
第三步:渲染HTML页面
把解析好的变量插入到你的模板HTML中,记得用htmlspecialchars()转义内容防止XSS攻击:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title><?php echo htmlspecialchars($title); ?></title> <!-- 这里可以引入你的通用CSS样式 --> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="content-container"> <header class="content-header"> <h1><?php echo htmlspecialchars($title); ?></h1> <div class="meta-info"> <span>作者:<?php echo htmlspecialchars($author); ?></span> <span>日期:<?php echo htmlspecialchars($date); ?></span> </div> <?php if (!empty($thumbnail)): ?> <img src="<?php echo htmlspecialchars($thumbnail); ?>" alt="<?php echo htmlspecialchars($title); ?> 缩略图" class="thumbnail"> <?php endif; ?> </header> <main class="content-body"> <?php foreach ($bodyParagraphs as $paragraph): ?> <p><?php echo htmlspecialchars($paragraph); ?></p> <?php endforeach; ?> </main> </div> </body> </html>
3. 自动生成内容列表(可选但高效)
如果你的内容很多,手动写链接太麻烦,可以做一个列表页面(比如index.php),自动遍历contentTxt目录下的所有TXT文件,读取标题并生成链接:
<?php $allowedDir = realpath('contentTxt'); // 获取目录下所有txt文件 $txtFiles = glob($allowedDir . '/*.txt'); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>全部内容列表</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="list-container"> <h1>全部内容</h1> <ul class="content-list"> <?php foreach ($txtFiles as $file): ?> <?php // 读取文件前两行获取标题 $lines = file($file, FILE_IGNORE_NEW_LINES); $contentTitle = $lines[1] ?? basename($file, '.txt'); // 生成相对路径用于GET参数 $relativePath = str_replace(realpath('./') . '/', '', $file); ?> <li> <a href="template.php?file=<?php echo urlencode($relativePath); ?>"> <?php echo htmlspecialchars($contentTitle); ?> </a> </li> <?php endforeach; ?> </ul> </div> </body> </html>
关键注意事项
- 安全第一:永远不要信任用户传入的参数,必须做目录和文件类型校验,防止目录遍历和XSS攻击。
- 兼容性:如果你的TXT文件有特殊编码(比如GBK),可以在
file()函数前加上mb_internal_encoding('UTF-8'),或者用file_get_contents()配合编码转换。 - 错误处理:可以给
file()函数加错误捕获,比如用@file()或者try-catch,避免文件不存在时抛出错误。
内容的提问来源于stack exchange,提问作者DMrFrost
相关产品推荐
相关产品推荐

