Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: htaccess.cls.php
}
[500] Fix | Delete
[501] Fix | Delete
return array_filter( $results );
[502] Fix | Delete
}
[503] Fix | Delete
[504] Fix | Delete
/**
[505] Fix | Delete
* Generate browser cache rules.
[506] Fix | Delete
*
[507] Fix | Delete
* @since 1.3
[508] Fix | Delete
* @access private
[509] Fix | Delete
*
[510] Fix | Delete
* @param array<string,mixed> $cfg The plugin configuration.
[511] Fix | Delete
* @return array<int,string> Rules set.
[512] Fix | Delete
*/
[513] Fix | Delete
private function _browser_cache_rules( $cfg ) {
[514] Fix | Delete
/**
[515] Fix | Delete
* Add ttl setting.
[516] Fix | Delete
*
[517] Fix | Delete
* @since 1.6.3
[518] Fix | Delete
*/
[519] Fix | Delete
$id = Base::O_CACHE_TTL_BROWSER;
[520] Fix | Delete
$ttl = $cfg[ $id ];
[521] Fix | Delete
$rules = array(
[522] Fix | Delete
self::EXPIRES_MODULE_START,
[523] Fix | Delete
'ExpiresActive on',
[524] Fix | Delete
'ExpiresByType application/pdf A' . $ttl,
[525] Fix | Delete
'ExpiresByType image/x-icon A' . $ttl,
[526] Fix | Delete
'ExpiresByType image/vnd.microsoft.icon A' . $ttl,
[527] Fix | Delete
'ExpiresByType image/svg+xml A' . $ttl,
[528] Fix | Delete
'',
[529] Fix | Delete
'ExpiresByType image/jpg A' . $ttl,
[530] Fix | Delete
'ExpiresByType image/jpeg A' . $ttl,
[531] Fix | Delete
'ExpiresByType image/png A' . $ttl,
[532] Fix | Delete
'ExpiresByType image/gif A' . $ttl,
[533] Fix | Delete
'ExpiresByType image/webp A' . $ttl,
[534] Fix | Delete
'ExpiresByType image/avif A' . $ttl,
[535] Fix | Delete
'',
[536] Fix | Delete
'ExpiresByType video/ogg A' . $ttl,
[537] Fix | Delete
'ExpiresByType audio/ogg A' . $ttl,
[538] Fix | Delete
'ExpiresByType video/mp4 A' . $ttl,
[539] Fix | Delete
'ExpiresByType video/webm A' . $ttl,
[540] Fix | Delete
'',
[541] Fix | Delete
'ExpiresByType text/css A' . $ttl,
[542] Fix | Delete
'ExpiresByType text/javascript A' . $ttl,
[543] Fix | Delete
'ExpiresByType application/javascript A' . $ttl,
[544] Fix | Delete
'ExpiresByType application/x-javascript A' . $ttl,
[545] Fix | Delete
'',
[546] Fix | Delete
'ExpiresByType application/x-font-ttf A' . $ttl,
[547] Fix | Delete
'ExpiresByType application/x-font-woff A' . $ttl,
[548] Fix | Delete
'ExpiresByType application/font-woff A' . $ttl,
[549] Fix | Delete
'ExpiresByType application/font-woff2 A' . $ttl,
[550] Fix | Delete
'ExpiresByType application/vnd.ms-fontobject A' . $ttl,
[551] Fix | Delete
'ExpiresByType font/ttf A' . $ttl,
[552] Fix | Delete
'ExpiresByType font/otf A' . $ttl,
[553] Fix | Delete
'ExpiresByType font/woff A' . $ttl,
[554] Fix | Delete
'ExpiresByType font/woff2 A' . $ttl,
[555] Fix | Delete
'',
[556] Fix | Delete
self::LS_MODULE_END,
[557] Fix | Delete
);
[558] Fix | Delete
return $rules;
[559] Fix | Delete
}
[560] Fix | Delete
[561] Fix | Delete
/**
[562] Fix | Delete
* Generate CORS rules for fonts.
[563] Fix | Delete
*
[564] Fix | Delete
* @since 1.5
[565] Fix | Delete
* @access private
[566] Fix | Delete
*
[567] Fix | Delete
* @return array<int,string> Rules set.
[568] Fix | Delete
*/
[569] Fix | Delete
private function _cors_rules() {
[570] Fix | Delete
return array(
[571] Fix | Delete
'<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font\.css)$">',
[572] Fix | Delete
'<IfModule mod_headers.c>',
[573] Fix | Delete
'Header set Access-Control-Allow-Origin "*"',
[574] Fix | Delete
'</IfModule>',
[575] Fix | Delete
'</FilesMatch>',
[576] Fix | Delete
);
[577] Fix | Delete
}
[578] Fix | Delete
[579] Fix | Delete
/**
[580] Fix | Delete
* Generate rewrite rules based on settings.
[581] Fix | Delete
*
[582] Fix | Delete
* @since 1.3
[583] Fix | Delete
* @access private
[584] Fix | Delete
*
[585] Fix | Delete
* @param array<string,mixed> $cfg The settings to be used for rewrite rule.
[586] Fix | Delete
* @return array{0:array<int,string>,1:array<int,string>,2:array<int,string>,3:array<int,string>} Rules arrays [frontend_ls, backend_ls, frontend_nonls, backend_nonls].
[587] Fix | Delete
*/
[588] Fix | Delete
private function _generate_rules( $cfg ) {
[589] Fix | Delete
$new_rules = array();
[590] Fix | Delete
$new_rules_nonls = array();
[591] Fix | Delete
$new_rules_backend = array();
[592] Fix | Delete
$new_rules_backend_nonls = array();
[593] Fix | Delete
[594] Fix | Delete
// continual crawler.
[595] Fix | Delete
$new_rules[] = self::MARKER_ASYNC . self::MARKER_START;
[596] Fix | Delete
$new_rules[] = 'RewriteCond %{REQUEST_URI} /wp-admin/admin-ajax\.php';
[597] Fix | Delete
$new_rules[] = 'RewriteCond %{QUERY_STRING} action=async_litespeed';
[598] Fix | Delete
$new_rules[] = 'RewriteRule .* - [E=noabort:1]';
[599] Fix | Delete
$new_rules[] = self::MARKER_ASYNC . self::MARKER_END;
[600] Fix | Delete
$new_rules[] = '';
[601] Fix | Delete
[602] Fix | Delete
// mobile agents.
[603] Fix | Delete
$id = Base::O_CACHE_MOBILE_RULES;
[604] Fix | Delete
if ( ( ! empty( $cfg[ Base::O_CACHE_MOBILE ] ) || ! empty( $cfg[ Base::O_GUEST ] ) ) && ! empty( $cfg[ $id ] ) ) {
[605] Fix | Delete
$new_rules[] = self::MARKER_MOBILE . self::MARKER_START;
[606] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} ' . Utility::arr2regex( $cfg[ $id ], true ) . ' [NC]';
[607] Fix | Delete
$new_rules[] = 'RewriteRule .* - [E=Cache-Control:vary=%{ENV:LSCACHE_VARY_VALUE}+ismobile]';
[608] Fix | Delete
$new_rules[] = self::MARKER_MOBILE . self::MARKER_END;
[609] Fix | Delete
$new_rules[] = '';
[610] Fix | Delete
}
[611] Fix | Delete
[612] Fix | Delete
// nocache cookie.
[613] Fix | Delete
$id = Base::O_CACHE_EXC_COOKIES;
[614] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[615] Fix | Delete
$new_rules[] = self::MARKER_NOCACHE_COOKIES . self::MARKER_START;
[616] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_COOKIE} ' . Utility::arr2regex( $cfg[ $id ], true );
[617] Fix | Delete
$new_rules[] = 'RewriteRule .* - [E=Cache-Control:no-cache]';
[618] Fix | Delete
$new_rules[] = self::MARKER_NOCACHE_COOKIES . self::MARKER_END;
[619] Fix | Delete
$new_rules[] = '';
[620] Fix | Delete
}
[621] Fix | Delete
[622] Fix | Delete
// nocache user agents.
[623] Fix | Delete
$id = Base::O_CACHE_EXC_USERAGENTS;
[624] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[625] Fix | Delete
$new_rules[] = self::MARKER_NOCACHE_USER_AGENTS . self::MARKER_START;
[626] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} ' . Utility::arr2regex( $cfg[ $id ], true ) . ' [NC]';
[627] Fix | Delete
$new_rules[] = 'RewriteRule .* - [E=Cache-Control:no-cache]';
[628] Fix | Delete
$new_rules[] = self::MARKER_NOCACHE_USER_AGENTS . self::MARKER_END;
[629] Fix | Delete
$new_rules[] = '';
[630] Fix | Delete
}
[631] Fix | Delete
[632] Fix | Delete
// check login cookie.
[633] Fix | Delete
$vary_cookies = $cfg[ Base::O_CACHE_VARY_COOKIES ];
[634] Fix | Delete
$id = Base::O_CACHE_LOGIN_COOKIE;
[635] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[636] Fix | Delete
$vary_cookies[] = $cfg[ $id ];
[637] Fix | Delete
}
[638] Fix | Delete
if ( LITESPEED_SERVER_TYPE === 'LITESPEED_SERVER_OLS' ) {
[639] Fix | Delete
// Need to keep this due to different behavior of OLS when handling response vary header @Sep/22/2018.
[640] Fix | Delete
if ( defined( 'COOKIEHASH' ) ) {
[641] Fix | Delete
$vary_cookies[] = ',wp-postpass_' . COOKIEHASH;
[642] Fix | Delete
}
[643] Fix | Delete
}
[644] Fix | Delete
$vary_cookies = apply_filters( 'litespeed_vary_cookies', $vary_cookies ); // todo: test if response vary header can work in latest OLS, drop the above two lines.
[645] Fix | Delete
// frontend and backend.
[646] Fix | Delete
if ( $vary_cookies ) {
[647] Fix | Delete
$env = 'Cache-Vary:' . implode( ',', $vary_cookies );
[648] Fix | Delete
$env = '"' . $env . '"';
[649] Fix | Delete
$new_rules[] = self::MARKER_LOGIN_COOKIE . self::MARKER_START;
[650] Fix | Delete
$new_rules_backend[] = self::MARKER_LOGIN_COOKIE . self::MARKER_START;
[651] Fix | Delete
[652] Fix | Delete
$new_rules[] = 'RewriteRule .? - [E=' . $env . ']';
[653] Fix | Delete
$new_rules_backend[] = 'RewriteRule .? - [E=' . $env . ']';
[654] Fix | Delete
[655] Fix | Delete
$new_rules[] = self::MARKER_LOGIN_COOKIE . self::MARKER_END;
[656] Fix | Delete
$new_rules_backend[] = self::MARKER_LOGIN_COOKIE . self::MARKER_END;
[657] Fix | Delete
$new_rules[] = '';
[658] Fix | Delete
}
[659] Fix | Delete
[660] Fix | Delete
// CORS font rules.
[661] Fix | Delete
$id = Base::O_CDN;
[662] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[663] Fix | Delete
$new_rules[] = self::MARKER_CORS . self::MARKER_START;
[664] Fix | Delete
$new_rules = array_merge( $new_rules, $this->_cors_rules() ); // todo: network.
[665] Fix | Delete
$new_rules[] = self::MARKER_CORS . self::MARKER_END;
[666] Fix | Delete
$new_rules[] = '';
[667] Fix | Delete
}
[668] Fix | Delete
[669] Fix | Delete
// webp/next-gen support.
[670] Fix | Delete
$id = Base::O_IMG_OPTM_WEBP;
[671] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[672] Fix | Delete
$next_gen_format = 'webp';
[673] Fix | Delete
if ( 2 === (int) $cfg[ $id ] ) {
[674] Fix | Delete
$next_gen_format = 'avif';
[675] Fix | Delete
}
[676] Fix | Delete
$new_rules[] = self::MARKER_WEBP . self::MARKER_START;
[677] Fix | Delete
// Check for WebP/AVIF support via HTTP_ACCEPT.
[678] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_ACCEPT} image/' . $next_gen_format . ' [OR]';
[679] Fix | Delete
[680] Fix | Delete
// Check for iPhone browsers (version > 13).
[681] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} iPhone\ OS\ (1[4-9]|[2-9][0-9]) [OR]';
[682] Fix | Delete
[683] Fix | Delete
// Check for macOS Safari (version >= 16.4).
[684] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} Macintosh.*Version/((1[7-9]|[2-9][0-9])|16\.([4-9]|[1-9][0-9])) [OR]';
[685] Fix | Delete
[686] Fix | Delete
// Check for Firefox (version >= 65).
[687] Fix | Delete
$new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} Firefox/([6-9][0-9]|[1-9][0-9]{2,})';
[688] Fix | Delete
[689] Fix | Delete
// Add vary.
[690] Fix | Delete
$new_rules[] = 'RewriteRule .* - [E=Cache-Control:vary=%{ENV:LSCACHE_VARY_VALUE}+webp]';
[691] Fix | Delete
$new_rules[] = self::MARKER_WEBP . self::MARKER_END;
[692] Fix | Delete
$new_rules[] = '';
[693] Fix | Delete
}
[694] Fix | Delete
[695] Fix | Delete
// drop qs support.
[696] Fix | Delete
$id = Base::O_CACHE_DROP_QS;
[697] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[698] Fix | Delete
$new_rules[] = self::MARKER_DROPQS . self::MARKER_START;
[699] Fix | Delete
foreach ( $cfg[ $id ] as $v ) {
[700] Fix | Delete
$new_rules[] = 'CacheKeyModify -qs:' . $v;
[701] Fix | Delete
}
[702] Fix | Delete
$new_rules[] = self::MARKER_DROPQS . self::MARKER_END;
[703] Fix | Delete
$new_rules[] = '';
[704] Fix | Delete
}
[705] Fix | Delete
[706] Fix | Delete
// Browser cache.
[707] Fix | Delete
$id = Base::O_CACHE_BROWSER;
[708] Fix | Delete
if ( ! empty( $cfg[ $id ] ) ) {
[709] Fix | Delete
$new_rules_nonls[] = self::MARKER_BROWSER_CACHE . self::MARKER_START;
[710] Fix | Delete
$new_rules_nonls = array_merge( $new_rules_nonls, $this->_browser_cache_rules( $cfg ) );
[711] Fix | Delete
$new_rules_nonls[] = self::MARKER_BROWSER_CACHE . self::MARKER_END;
[712] Fix | Delete
$new_rules_nonls[] = '';
[713] Fix | Delete
[714] Fix | Delete
$new_rules_backend_nonls[] = self::MARKER_BROWSER_CACHE . self::MARKER_START;
[715] Fix | Delete
$new_rules_backend_nonls = array_merge( $new_rules_backend_nonls, $this->_browser_cache_rules( $cfg ) );
[716] Fix | Delete
$new_rules_backend_nonls[] = self::MARKER_BROWSER_CACHE . self::MARKER_END;
[717] Fix | Delete
$new_rules_backend_nonls[] = '';
[718] Fix | Delete
}
[719] Fix | Delete
[720] Fix | Delete
// Add module wrapper for LiteSpeed rules.
[721] Fix | Delete
if ( $new_rules ) {
[722] Fix | Delete
$new_rules = $this->_wrap_ls_module( $new_rules );
[723] Fix | Delete
}
[724] Fix | Delete
[725] Fix | Delete
if ( $new_rules_backend ) {
[726] Fix | Delete
$new_rules_backend = $this->_wrap_ls_module( $new_rules_backend );
[727] Fix | Delete
}
[728] Fix | Delete
[729] Fix | Delete
return array( $new_rules, $new_rules_backend, $new_rules_nonls, $new_rules_backend_nonls );
[730] Fix | Delete
}
[731] Fix | Delete
[732] Fix | Delete
/**
[733] Fix | Delete
* Add LiteSpeed module wrapper with rewrite on.
[734] Fix | Delete
*
[735] Fix | Delete
* @since 2.1.1
[736] Fix | Delete
* @access private
[737] Fix | Delete
*
[738] Fix | Delete
* @param array<int,string> $rules Rules to wrap.
[739] Fix | Delete
* @return array<int,string> Wrapped rules.
[740] Fix | Delete
*/
[741] Fix | Delete
private function _wrap_ls_module( $rules = array() ) {
[742] Fix | Delete
return array_merge( $this->__rewrite_general, array( self::LS_MODULE_START ), $this->__rewrite_on, array( '' ), $rules, array( self::LS_MODULE_END )
[743] Fix | Delete
);
[744] Fix | Delete
}
[745] Fix | Delete
[746] Fix | Delete
/**
[747] Fix | Delete
* Insert LiteSpeed module wrapper with rewrite on.
[748] Fix | Delete
*
[749] Fix | Delete
* @since 2.1.1
[750] Fix | Delete
* @access public
[751] Fix | Delete
* @return void
[752] Fix | Delete
*/
[753] Fix | Delete
public function insert_ls_wrapper() {
[754] Fix | Delete
$rules = $this->_wrap_ls_module();
[755] Fix | Delete
$this->_insert_wrapper( $rules );
[756] Fix | Delete
}
[757] Fix | Delete
[758] Fix | Delete
/**
[759] Fix | Delete
* Wrap rules with do-not-edit markers.
[760] Fix | Delete
*
[761] Fix | Delete
* @since 1.1.5
[762] Fix | Delete
*
[763] Fix | Delete
* @param array<int,string>|false $rules Rules array or false.
[764] Fix | Delete
* @return array<int,string>|false Wrapped rules, or false if $rules was false.
[765] Fix | Delete
*/
[766] Fix | Delete
private function _wrap_do_no_edit( $rules ) {
[767] Fix | Delete
// When clearing rules, don't need DO NOT EDIT msg.
[768] Fix | Delete
if ( false === $rules || ! is_array( $rules ) ) {
[769] Fix | Delete
return $rules;
[770] Fix | Delete
}
[771] Fix | Delete
[772] Fix | Delete
$rules = array_merge( array( self::LS_MODULE_DONOTEDIT ), $rules, array( self::LS_MODULE_DONOTEDIT ) );
[773] Fix | Delete
[774] Fix | Delete
return $rules;
[775] Fix | Delete
}
[776] Fix | Delete
[777] Fix | Delete
/**
[778] Fix | Delete
* Write to htaccess with rules.
[779] Fix | Delete
*
[780] Fix | Delete
* NOTE: will throw error if failed.
[781] Fix | Delete
*
[782] Fix | Delete
* @since 1.1.0
[783] Fix | Delete
* @access private
[784] Fix | Delete
*
[785] Fix | Delete
* @param array<int,string>|false $rules Rules to write. Pass false to clear.
[786] Fix | Delete
* @param string|false $kind 'frontend' or 'backend'. Defaults to 'frontend'.
[787] Fix | Delete
* @param string|false $marker Marker name. Defaults to self::MARKER.
[788] Fix | Delete
* @return void
[789] Fix | Delete
* @throws \Exception If write fails.
[790] Fix | Delete
*/
[791] Fix | Delete
private function _insert_wrapper( $rules = array(), $kind = false, $marker = false ) {
[792] Fix | Delete
if ( 'backend' !== $kind ) {
[793] Fix | Delete
$kind = 'frontend';
[794] Fix | Delete
}
[795] Fix | Delete
[796] Fix | Delete
// Default marker is LiteSpeed marker `LSCACHE`.
[797] Fix | Delete
if ( false === $marker ) {
[798] Fix | Delete
$marker = self::MARKER;
[799] Fix | Delete
}
[800] Fix | Delete
[801] Fix | Delete
$this->_htaccess_backup( $kind );
[802] Fix | Delete
[803] Fix | Delete
File::insert_with_markers( $this->htaccess_path( $kind ), $this->_wrap_do_no_edit( $rules ), $marker, true );
[804] Fix | Delete
}
[805] Fix | Delete
[806] Fix | Delete
/**
[807] Fix | Delete
* Update rewrite rules based on setting.
[808] Fix | Delete
*
[809] Fix | Delete
* NOTE: will throw error if failed.
[810] Fix | Delete
*
[811] Fix | Delete
* @since 1.3
[812] Fix | Delete
* @access public
[813] Fix | Delete
*
[814] Fix | Delete
* @param array<string,mixed> $cfg Plugin configuration.
[815] Fix | Delete
* @return bool True on success.
[816] Fix | Delete
* @throws \Exception When automatic update fails (provides manual instructions).
[817] Fix | Delete
*/
[818] Fix | Delete
public function update( $cfg ) {
[819] Fix | Delete
list( $frontend_rules, $backend_rules, $frontend_rules_nonls, $backend_rules_nonls ) = $this->_generate_rules( $cfg );
[820] Fix | Delete
[821] Fix | Delete
// Check frontend content.
[822] Fix | Delete
list( $rules, $rules_nonls ) = $this->_extract_rules();
[823] Fix | Delete
[824] Fix | Delete
// Check Non-LiteSpeed rules.
[825] Fix | Delete
if ( $this->_wrap_do_no_edit( $frontend_rules_nonls ) !== $rules_nonls ) {
[826] Fix | Delete
Debug2::debug( '[Rules] Update non-ls frontend rules' );
[827] Fix | Delete
// Need to update frontend htaccess.
[828] Fix | Delete
try {
[829] Fix | Delete
$this->_insert_wrapper( $frontend_rules_nonls, false, self::MARKER_NONLS );
[830] Fix | Delete
} catch ( \Exception $e ) {
[831] Fix | Delete
$manual_guide_codes = $this->_rewrite_codes_msg( $this->frontend_htaccess, $frontend_rules_nonls, self::MARKER_NONLS );
[832] Fix | Delete
Debug2::debug( '[Rules] Update Failed' );
[833] Fix | Delete
throw new \Exception( $manual_guide_codes ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Message is for admin display.
[834] Fix | Delete
}
[835] Fix | Delete
}
[836] Fix | Delete
[837] Fix | Delete
// Check LiteSpeed rules.
[838] Fix | Delete
if ( $this->_wrap_do_no_edit( $frontend_rules ) !== $rules ) {
[839] Fix | Delete
Debug2::debug( '[Rules] Update frontend rules' );
[840] Fix | Delete
// Need to update frontend htaccess.
[841] Fix | Delete
try {
[842] Fix | Delete
$this->_insert_wrapper( $frontend_rules );
[843] Fix | Delete
} catch ( \Exception $e ) {
[844] Fix | Delete
Debug2::debug( '[Rules] Update Failed' );
[845] Fix | Delete
$manual_guide_codes = $this->_rewrite_codes_msg( $this->frontend_htaccess, $frontend_rules );
[846] Fix | Delete
throw new \Exception( $manual_guide_codes ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Message is for admin display.
[847] Fix | Delete
}
[848] Fix | Delete
}
[849] Fix | Delete
[850] Fix | Delete
if ( $this->frontend_htaccess !== $this->backend_htaccess ) {
[851] Fix | Delete
list( $rules, $rules_nonls ) = $this->_extract_rules( 'backend' );
[852] Fix | Delete
[853] Fix | Delete
// Check Non-LiteSpeed rules for backend.
[854] Fix | Delete
if ( $this->_wrap_do_no_edit( $backend_rules_nonls ) !== $rules_nonls ) {
[855] Fix | Delete
Debug2::debug( '[Rules] Update non-ls backend rules' );
[856] Fix | Delete
// Need to update backend htaccess.
[857] Fix | Delete
try {
[858] Fix | Delete
$this->_insert_wrapper( $backend_rules_nonls, 'backend', self::MARKER_NONLS );
[859] Fix | Delete
} catch ( \Exception $e ) {
[860] Fix | Delete
Debug2::debug( '[Rules] Update Failed' );
[861] Fix | Delete
$manual_guide_codes = $this->_rewrite_codes_msg( $this->backend_htaccess, $backend_rules_nonls, self::MARKER_NONLS );
[862] Fix | Delete
throw new \Exception( $manual_guide_codes ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Message is for admin display.
[863] Fix | Delete
}
[864] Fix | Delete
}
[865] Fix | Delete
[866] Fix | Delete
// Check backend content.
[867] Fix | Delete
if ( $this->_wrap_do_no_edit( $backend_rules ) !== $rules ) {
[868] Fix | Delete
Debug2::debug( '[Rules] Update backend rules' );
[869] Fix | Delete
// Need to update backend htaccess.
[870] Fix | Delete
try {
[871] Fix | Delete
$this->_insert_wrapper( $backend_rules, 'backend' );
[872] Fix | Delete
} catch ( \Exception $e ) {
[873] Fix | Delete
Debug2::debug( '[Rules] Update Failed' );
[874] Fix | Delete
$manual_guide_codes = $this->_rewrite_codes_msg( $this->backend_htaccess, $backend_rules );
[875] Fix | Delete
throw new \Exception( $manual_guide_codes ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Message is for admin display.
[876] Fix | Delete
}
[877] Fix | Delete
}
[878] Fix | Delete
}
[879] Fix | Delete
[880] Fix | Delete
return true;
[881] Fix | Delete
}
[882] Fix | Delete
[883] Fix | Delete
/**
[884] Fix | Delete
* Get existing rewrite rules.
[885] Fix | Delete
*
[886] Fix | Delete
* NOTE: will throw error if failed.
[887] Fix | Delete
*
[888] Fix | Delete
* @since 1.3
[889] Fix | Delete
* @access private
[890] Fix | Delete
*
[891] Fix | Delete
* @param string $kind Frontend or backend .htaccess file.
[892] Fix | Delete
* @return array{0:array<int,string>,1:array<int,string>} A tuple of [ls_rules, nonls_rules].
[893] Fix | Delete
* @throws \Exception If file is not readable.
[894] Fix | Delete
*/
[895] Fix | Delete
private function _extract_rules( $kind = 'frontend' ) {
[896] Fix | Delete
clearstatcache();
[897] Fix | Delete
$path = $this->htaccess_path( $kind );
[898] Fix | Delete
if ( ! $this->_readable( $kind ) ) {
[899] Fix | Delete
Error::t( 'E_HTA_R' );
[900] Fix | Delete
}
[901] Fix | Delete
[902] Fix | Delete
$rules = File::extract_from_markers( $path, self::MARKER );
[903] Fix | Delete
$rules_nonls = File::extract_from_markers( $path, self::MARKER_NONLS );
[904] Fix | Delete
[905] Fix | Delete
return array( $rules, $rules_nonls );
[906] Fix | Delete
}
[907] Fix | Delete
[908] Fix | Delete
/**
[909] Fix | Delete
* Output the msg with rules plain data for manual insert.
[910] Fix | Delete
*
[911] Fix | Delete
* @since 1.1.5
[912] Fix | Delete
*
[913] Fix | Delete
* @param string $file The target file path.
[914] Fix | Delete
* @param array<int,string> $rules The rules to be inserted.
[915] Fix | Delete
* @param string|false $marker Optional marker name. Defaults to LiteSpeed's marker.
[916] Fix | Delete
* @return string The final message (HTML) to output.
[917] Fix | Delete
*/
[918] Fix | Delete
private function _rewrite_codes_msg( $file, $rules, $marker = false ) {
[919] Fix | Delete
return sprintf(
[920] Fix | Delete
/* translators: 1: file path, 2: code block */
[921] Fix | Delete
__( '<p>Please add/replace the following codes into the beginning of %1$s:</p> %2$s', 'litespeed-cache' ),
[922] Fix | Delete
esc_html( $file ),
[923] Fix | Delete
'<textarea style="width:100%;" rows="10" readonly>' . esc_textarea( $this->_wrap_rules_with_marker( $rules, $marker ) ) . '</textarea>'
[924] Fix | Delete
);
[925] Fix | Delete
}
[926] Fix | Delete
[927] Fix | Delete
/**
[928] Fix | Delete
* Generate rules plain data for manual insert.
[929] Fix | Delete
*
[930] Fix | Delete
* @since 1.1.5
[931] Fix | Delete
*
[932] Fix | Delete
* @param array<int,string>|false $rules Rules to wrap or false.
[933] Fix | Delete
* @param string|false $marker Optional marker name. Defaults to LiteSpeed's marker.
[934] Fix | Delete
* @return string The plain text of the rules with markers.
[935] Fix | Delete
*/
[936] Fix | Delete
private function _wrap_rules_with_marker( $rules, $marker = false ) {
[937] Fix | Delete
// Default marker is LiteSpeed marker `LSCACHE`.
[938] Fix | Delete
if ( false === $marker ) {
[939] Fix | Delete
$marker = self::MARKER;
[940] Fix | Delete
}
[941] Fix | Delete
[942] Fix | Delete
$start_marker = "# BEGIN {$marker}";
[943] Fix | Delete
$end_marker = "# END {$marker}";
[944] Fix | Delete
$new_file_data = implode( "\n", array_merge( array( $start_marker ), $this->_wrap_do_no_edit( $rules ), array( $end_marker ) ) );
[945] Fix | Delete
[946] Fix | Delete
return $new_file_data;
[947] Fix | Delete
}
[948] Fix | Delete
[949] Fix | Delete
/**
[950] Fix | Delete
* Clear the rules file of any changes added by the plugin specifically.
[951] Fix | Delete
*
[952] Fix | Delete
* @since 1.0.4
[953] Fix | Delete
* @access public
[954] Fix | Delete
*
[955] Fix | Delete
* @return void
[956] Fix | Delete
*/
[957] Fix | Delete
public function clear_rules() {
[958] Fix | Delete
$this->_insert_wrapper( false ); // Use false to avoid do-not-edit msg.
[959] Fix | Delete
// Clear non ls rules.
[960] Fix | Delete
$this->_insert_wrapper( false, false, self::MARKER_NONLS );
[961] Fix | Delete
[962] Fix | Delete
if ( $this->frontend_htaccess !== $this->backend_htaccess ) {
[963] Fix | Delete
$this->_insert_wrapper( false, 'backend' );
[964] Fix | Delete
$this->_insert_wrapper( false, 'backend', self::MARKER_NONLS );
[965] Fix | Delete
}
[966] Fix | Delete
}
[967] Fix | Delete
}
[968] Fix | Delete
[969] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function