PluginProbe
BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript / 4.1.12
BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript v4.1.12
4.1.16 4.1.15 4.1.14 4.1.13 4.1.12 4.1.11 4.1.10 4.0.30 4.0.29 4.0.28 4.0.27 4.0.26 4.0.24 4.0.25 4.0.23 4.0.22 4.0.21 4.0.19 4.0.18 4.0.17 4.0.16 1.9.3 1.9.4 1.9.5 1.9.6 All 170 releases
searchpro / inc / common-functions.php

common-functions.php in BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript 4.1.12, at inc/common-functions.php

197 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 function bwp_pass_cookie_requirement() {
4 $berqconfigs = berqConfigs::getInstance();
5 $configs = $berqconfigs->get_configs();
6 $default = ['berqwpnocache', 'wp-postpass', 'comment_author', 'woocommerce_cart_hash', 'edd_items_in_cart'];
7 $excluded_cookies = array_merge($configs['exclude_cookies'], $default);
8
9 if (!empty($excluded_cookies)) {
10 foreach ($excluded_cookies as $cookie_id) {
11
12 // Skip if empty
13 if (empty($cookie_id)) {
14 continue;
15 }
16
17 foreach ($_COOKIE as $key => $value) {
18 if (strpos($key, $cookie_id) === 0) {
19 return false;
20 }
21 }
22 }
23 }
24
25 return true;
26 }
27
28 function bwp_get_request_url() {
29 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
30 $scheme = 'https://';
31 } else {
32 $scheme = (wp_parse_url(get_option('home'), PHP_URL_SCHEME) === 'https') ? 'https://' : 'http://';
33 }
34 $host = isset($_SERVER['HTTP_HOST']) ? strip_tags(stripslashes($_SERVER['HTTP_HOST'])) : 'localhost';
35 $uri = isset($_SERVER['REQUEST_URI']) ? strip_tags(stripslashes($_SERVER['REQUEST_URI'])) : '/';
36 $url = $scheme . $host . $uri;
37 return strtolower($url);
38 }
39
40 // function bwp_build_cache_path($url) {
41 // $parts = parse_url($url);
42
43 // $host = $parts['host'] ?? '';
44 // $path = $parts['path'] ?? '/';
45
46 // // normalize
47 // $path = '/' . ltrim($path, '/');
48 // $path = rtrim($path, '/');
49
50 // if ($path === '') {
51 // $path = '/';
52 // }
53
54 // // sanitize
55 // $host = preg_replace('#[^a-zA-Z0-9\.\-]#', '', $host);
56 // $path = preg_replace('#[^a-zA-Z0-9/_-]#', '', $path);
57
58 // return $host . $path;
59 // }
60
61 function bwp_build_cache_path($url) {
62 $parts = parse_url($url);
63 $host = $parts['host'] ?? '';
64 $path = $parts['path'] ?? '/';
65 $query = $parts['query'] ?? '';
66
67 // normalize path
68 $path = '/' . ltrim($path, '/');
69 $path = rtrim($path, '/');
70 if ($path === '') {
71 $path = '/';
72 }
73
74 // sanitize host
75 $host = preg_replace('#[^a-zA-Z0-9\.\-]#', '', $host);
76
77 // Normalize percent-encoded chars to raw UTF-8, then strip only chars that
78 // are unsafe on filesystems (null bytes, path traversal sequences).
79 $path = urldecode($path);
80 $path = str_replace("\0", '', $path);
81 $path = preg_replace('#\.\.+#', '', $path);
82 $path = preg_replace('#[<>:"\\\\|?*]#', '', $path);
83
84 if ($query === '') {
85 return $path === '/' ? $host : $host . $path;
86 }
87
88 // normalize query param order so ?b=2&a=1 and ?a=1&b=2 hit the same cache
89 parse_str($query, $params);
90 ksort($params);
91 $normalized_query = http_build_query($params);
92
93 // hash it — query strings can contain anything and be very long
94 $query_hash = substr(md5($normalized_query), 0, 12);
95
96 return $host . $path . '/q-' . $query_hash;
97 }
98
99 function bwp_serve_advanced_cache($serve_from = 'plugin') {
100
101 if (php_sapi_name() === 'cli' || (defined('WP_CLI') && WP_CLI)) {
102 return;
103 }
104
105 if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'GET' && !bwp_is_user_logged_in() && !bwp_is_ajax() && !berqDetectCrawler::is_crawler() && bwp_pass_cookie_requirement()) {
106 $berqconfigs = berqConfigs::getInstance();
107 $configs = $berqconfigs->get_configs();
108 $url = bwp_get_request_url();
109 $url = @dropin_remove_ignore_params($url);
110 $cache_key = md5($url);
111 $cache_directory = WP_CONTENT_DIR . '/cache/berqwp/html/';
112 if (defined('MULTISITE') && MULTISITE) {
113 $blog_id = berqConfigs::detect_blog_id_from_request();
114 $cache_directory .= 'site-' . $blog_id . '/';
115 }
116 $cache_file = $cache_directory . $cache_key . '.html';
117 $cache_file_gz = $cache_directory . $cache_key . '.gz';
118 $cache_file_gz = $cache_directory . bwp_build_cache_path($url) . '/index.html.gz';
119 $cache_file = $cache_file_gz;
120 $cache_max_life = file_exists($cache_file) ? @filemtime($cache_file) + $configs['cache_lifespan'] : null;
121 // $compression_enabled = $configs['page_compression'] === true;
122 $compression_enabled = true;
123 $accept_encoding = $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '';
124 $supports_gzip = strpos($accept_encoding, 'gzip') !== false;
125 $domain = isset($_SERVER['HTTP_HOST']) ? strip_tags(stripslashes($_SERVER['HTTP_HOST'])) : '';
126
127 if (berqwp_dropin_is_page_url_excluded($url)) {
128 return;
129 }
130
131 if (file_exists($cache_file) && $cache_max_life > time()) {
132 $file_content = @file_get_contents($cache_file);
133
134 if (!isset($_GET['creating_cache']) && file_exists($cache_file)) {
135
136 if (strpos($file_content, "Optimized with BerqWP's instant cache") !== false && (filemtime($cache_file) + DAY_IN_SECONDS) < time()) {
137 return;
138 }
139
140 // Prepare gzip cache file
141 if ($compression_enabled && file_exists($cache_file_gz)) {
142 $cache_file = $cache_file_gz;
143 // header('Content-Encoding: gzip');
144 header_remove('Content-Encoding');
145 }
146
147 $lastModified = filemtime($cache_file);
148 $etag = md5_file($cache_file);
149 header('ETag: ' . $etag);
150 header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
151 header('X-File-Size: ' . filesize($cache_file), true);
152 header('Content-Type: text/html; charset=utf-8');
153 header("X-served: $serve_from");
154 header("X-BerqWP-Cache: HIT");
155 // header('Vary: Cookie');
156
157 // Check if the client has a cached copy and if it's still valid using Last-Modified
158 if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) || (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] === $etag)) {
159 // The client's cache is still valid based on Last-Modified, respond with a 304 Not Modified
160 header('HTTP/1.1 304 Not Modified');
161 // header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
162 // header("Expires: 0");
163 // header('Cache-Control: no-cache, must-revalidate');
164 header('Cache-Control: public, max-age=600, s-maxage=2592000, stale-while-revalidate=86400', true);
165 header('cdn-cache-control: max-age=2592000');
166 header("Cache-Tag: $domain");
167 exit();
168
169 }
170
171 // Prevent PHP/Apache from re-compressing the already-gzipped cache file
172 if (ini_get('zlib.output_compression')) {
173 ini_set('zlib.output_compression', 'Off');
174 }
175
176 while (ob_get_level()) {
177 ob_end_clean();
178 }
179
180 // header('Cache-Control: public, max-age=0, s-maxage=3600, must-revalidate', true);
181 // header('Cache-Control: public, max-age=60, s-maxage=3600, stale-while-revalidate=60, must-revalidate', true);
182 header('Cache-Control: public, max-age=600, s-maxage=2592000, stale-while-revalidate=86400', true);
183 header('cdn-cache-control: max-age=2592000');
184 header("Cache-Tag: $domain");
185 // header("Content-Security-Policy: script-src 'self' blob: 'unsafe-inline'");
186 header('Vary: Accept-Encoding, Cookie');
187 header('Content-Encoding: gzip', true);
188 header('Content-Length: ' . filesize($cache_file), true);
189 readfile($cache_file);
190 exit();
191 }
192
193 }
194
195 }
196 }
197