网站全静态化实现方式

      发布在:后端技术      评论:0 条评论

网站全静态化实现方式,这里提供的解决方法是在不改动原框架的实现方式,首先新增文件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即可

阿里云服务器1核/2G/1M(88元/1年) 【腾讯云】云产品限时秒杀,爆款2核4G云服务器首年74元 腾讯云服务器老用户专享(每日限量,下手要快) 香港高稳定云服务器推荐(优惠码:haixiuge)
相关文章
热门推荐