网站全静态化实现方式,这里提供的解决方法是在不改动原框架的实现方式,首先新增文件generate_static.php代码如下:
<?php header('Content-Type: application/json'); // 获取前端传递的参数 $path = isset($_GET['path']) ? $_GET['path'] : ''; $force = isset($_GET['force']) && $_GET['force'] == '1'; if(empty($path)) { echo json_encode(['code' => 400, 'msg' => '缺少URL参数']); exit; } // 安全过滤:仅允许字母数字和斜杠 /*if(!preg_match('/^[a-z0-9\/\-]+\.html$/i', $path)) { echo json_encode(['code' => 403, 'msg' => '非法URL格式']); exit; }*/ // 目标静态文件路径 $staticFile = __DIR__ . '/' . $path; //判断是否是.html结尾不是则加上index.html if(!preg_match('/\.html$/', $path)) { $staticFile = __DIR__ . '/' . trim($path, '/') . '/index.html'; } $staticDir = dirname($staticFile); // 创建目录(如果不存在) if(!is_dir($staticDir)) { if(!mkdir($staticDir, 0755, true)) { echo json_encode(['code' => 500, 'msg' => '目录创建失败']); exit; } } // 检查是否需要重新生成 $needGenerate = true; if(file_exists($staticFile)) { $fileTime = filemtime($staticFile); $expireTime = 1800; // 30分钟有效期 // 检查是否在有效期内且没有强制更新 if((time() - $fileTime < $expireTime) && !$force) { $needGenerate = false; } } // 返回缓存文件(如果不需要重新生成) if(!$needGenerate) { echo json_encode([ 'code' => 304, 'msg' => '缓存有效', 'path' => $path ]); exit; } // 生成动态URL(使用当前域名) $dynamicUrl = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://'; //请求地址改成动态请求地址 $dynamicUrl .= $_SERVER['HTTP_HOST'] . '/index.php?s=' . urlencode($path); // 使用cURL获取动态内容(可以获取HTTP状态码) $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $dynamicUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, 'Static Cache Generator'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 10秒连接超时 curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 30秒总超时 $content = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 检查HTTP状态码 - 仅缓存200响应 if($httpCode !== 200) { $errorMsg = "动态内容获取失败 (HTTP {$httpCode})"; // 如果文件已存在但过期,返回现有文件路径 if(file_exists($staticFile)) { echo json_encode([ 'code' => 200, 'msg' => '使用过期缓存', 'path' => $path, 'warning' => $errorMsg ]); exit; } echo json_encode([ 'code' => 503, 'msg' => $errorMsg, 'http_code' => $httpCode ]); exit; } // 检查内容是否有效 if(empty($content)) { echo json_encode(['code' => 503, 'msg' => '动态内容为空']); exit; } // 写入静态文件 if(file_put_contents($staticFile, $content) === false) { echo json_encode(['code' => 500, 'msg' => '文件写入失败']); exit; } // 返回成功响应 echo json_encode([ 'code' => 200, 'msg' => '静态文件已生成', 'path' => $path, 'generated' => date('Y-m-d H:i:s') ]);
然后在模板文件增加如下代码,触发生成静态文件
function generateStatic() { // 通过js获取路径 var path = window.location.pathname; // js获取force参数的值【增加是否强制更新缓存参数】 var force = getQueryVariable("force"); var q = {}; location.search.replace(/([^?&=]+)=([^&]+)/g,function(_,k,v){q[k]=v}); $.ajax({ url: '/generate_static.php', type: 'GET', data: { path: path, force: q.force // 可选强制更新参数 }, success: function(response) { if(response.code === 200) { console.log('生成成功:', response.path); } else if(response.code === 304) { console.log('使用缓存:', response.path); } else { console.error('错误:', response.msg); } } }); } // 页面加载时触发 $(document).ready(function() { generateStatic(); });
生成模板代码增加了30分钟的缓存时间,如果需要强制更新静态文件访问页面增加参数force=1即可
相关文章