网站全静态化实现方式,这里提供的解决方法是在不改动原框架的实现方式,首先新增文件generate_static.php代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | <?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' ) ]); |
然后在模板文件增加如下代码,触发生成静态文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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即可
相关文章