File "class-gzip.php"

Full Path: /home/theinspectionboy/public_html/suffolk/includes-20250622113618/class-gzip.php
File size: 8.29 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Class and methods to insert Gzip and other rules to .htaccess file.
 *
 * @link https://ewww.io/swis/
 * @package SWIS_Performance
 */

namespace SWIS;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Automatically insert rules to .htaccess.
 */
final class GZIP extends Base {

	/**
	 * Register actions and filters for Lazy Load.
	 */
	function __construct() {
		if ( defined( 'WPE_PLUGIN_VERSION' ) ) {
			return;
		}
		if ( apply_filters( 'swis_no_htaccess', false ) ) {
			return;
		}
		parent::__construct();
		add_action( 'admin_init', array( $this, 'admin_init' ), 9 );
	}

	/**
	 * Make sure plugin is setup.
	 */
	function admin_init() {
		if ( get_option( 'swis_activation' ) ) {
			$this->insert_htaccess_rules();
		}
	}

	/**
	 * Let folks know we could not auto-insert the rules.
	 */
	function htaccess_failure() {
		$this->debug_message( '<b>' . __METHOD__ . '()</b>' );
		echo '<div class="notice notice-error is-dismissible"><p>' .
			sprintf(
				/* translators: 1: SWIS Performance 2: Permalink Settings */
				esc_html__( '%1$s was unable to configure your site with gzip and proper cache-control headers. Please check that %2$s is writable and de-activate/re-activate SWIS to try again.', 'swis-performance' ),
				'<strong>SWIS Performance</strong>',
				'<code>' . wp_kses_post( $this->get_htaccess_path() ) . '</code>'
			) .
			'</p></div>';
	}

	/**
	 * Figure out where the .htaccess file should live.
	 *
	 * @return string The path to the .htaccess file.
	 */
	function get_htaccess_path() {
		$this->debug_message( '<b>' . __METHOD__ . '()</b>' );
		$htpath = get_home_path();
		$this->debug_message( "using $htpath.htaccess" );
		return "$htpath.htaccess";
	}

	/**
	 * If rules are present, stay silent. Otherwise, give us some rules to insert!
	 *
	 * @return array Rules to be inserted.
	 */
	function rewrite_verify() {
		$this->debug_message( '<b>' . __METHOD__ . '()</b>' );
		$current_rules = extract_from_markers( $this->get_htaccess_path(), 'SWIS Performance' );
		$swis_rules    = array(
			'AddDefaultCharset UTF-8',
			'# Force UTF-8 for a few others',
			'<IfModule mod_mime.c>',
			'AddCharset UTF-8 .atom .css .js .json .rss .vtt .xml',
			'AddType image/webp .webp',
			'AddType font/woff2 .woff2',
			'</IfModule>',
			'# Because ETags suck eggs.',
			'<IfModule mod_headers.c>',
			'Header unset ETag',
			'</IfModule>',
			'FileETag None',
			'<FilesMatch "\.(html|htm|rtf|rtx|txt|xsd|xsl|xml)$">',
			'<IfModule mod_headers.c>',
			'Header unset Last-Modified',
			'</IfModule>',
			'</FilesMatch>',
			'<FilesMatch "\.(html|htm|rtf|rtx|txt|xsd|xsl|xml|css|htc|js|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$">',
			'<IfModule mod_headers.c>',
			'Header unset Pragma',
			'Header append Cache-Control "public"',
			'</IfModule>',
			'</FilesMatch>',
			'# Expires headers to improve cache control.',
			'<IfModule mod_expires.c>',
			'ExpiresActive on',
			'ExpiresDefault                              "access plus 1 month"',
			'# stuff not to cache',
			'ExpiresByType text/cache-manifest           "access plus 0 seconds"',
			'ExpiresByType text/html                     "access plus 0 seconds"',
			'ExpiresByType text/xml                      "access plus 0 seconds"',
			'ExpiresByType application/xml               "access plus 0 seconds"',
			'ExpiresByType application/xhtml+xml         "access plus 0 seconds"',
			'ExpiresByType application/json              "access plus 0 seconds"',
			'# Feeds',
			'ExpiresByType application/rss+xml           "access plus 1 hour"',
			'ExpiresByType application/atom+xml          "access plus 1 hour"',
			'# Media',
			'ExpiresByType image/gif                     "access plus 4 months"',
			'ExpiresByType image/png                     "access plus 4 months"',
			'ExpiresByType image/jpeg                    "access plus 4 months"',
			'ExpiresByType image/webp                    "access plus 4 months"',
			'ExpiresByType image/svg+xml                 "access plus 1 month"',
			'ExpiresByType image/x-icon                  "access plus 1 month"',
			'ExpiresByType image/vnd.microsoft.icon      "access plus 1 month"',
			'ExpiresByType video/ogg                     "access plus 1 month"',
			'ExpiresByType audio/ogg                     "access plus 1 month"',
			'ExpiresByType video/mp4                     "access plus 1 month"',
			'ExpiresByType video/webm                    "access plus 1 month"',
			'# HTC files',
			'ExpiresByType text/x-component              "access plus 1 month"',
			'# Fonts',
			'ExpiresByType font/ttf                      "access plus 4 months"',
			'ExpiresByType font/otf                      "access plus 4 months"',
			'ExpiresByType font/opentype                 "access plus 4 months"',
			'ExpiresByType font/woff                     "access plus 4 months"',
			'ExpiresByType font/woff2                    "access plus 4 months"',
			'ExpiresByType application/vnd.ms-fontobject "access plus 4 months"',
			'ExpiresByType application/x-font            "access plus 4 months"',
			'ExpiresByType application/x-font-opentype   "access plus 4 months"',
			'ExpiresByType application/x-font-otf        "access plus 4 months"',
			'ExpiresByType application/x-font-truetype   "access plus 4 months"',
			'ExpiresByType application/x-font-ttf        "access plus 4 months"',
			'# CSS/JS',
			'ExpiresByType text/css                      "access plus 1 year"',
			'ExpiresByType application/javascript        "access plus 1 year"',
			'ExpiresByType application/x-javascript      "access plus 1 year"',
			'</IfModule>',
			'<IfModule mod_deflate.c>',
			'# Compress HTML, CSS, JavaScript, Text, XML and fonts',
			'AddOutputFilterByType DEFLATE application/javascript',
			'AddOutputFilterByType DEFLATE application/json',
			'AddOutputFilterByType DEFLATE application/rss+xml',
			'AddOutputFilterByType DEFLATE application/vnd.ms-fontobject',
			'AddOutputFilterByType DEFLATE application/x-font',
			'AddOutputFilterByType DEFLATE application/x-font-opentype',
			'AddOutputFilterByType DEFLATE application/x-font-otf',
			'AddOutputFilterByType DEFLATE application/x-font-truetype',
			'AddOutputFilterByType DEFLATE application/x-font-ttf',
			'AddOutputFilterByType DEFLATE application/x-javascript',
			'AddOutputFilterByType DEFLATE application/xhtml+xml',
			'AddOutputFilterByType DEFLATE application/xml',
			'AddOutputFilterByType DEFLATE font/opentype',
			'AddOutputFilterByType DEFLATE font/otf',
			'AddOutputFilterByType DEFLATE font/ttf',
			'AddOutputFilterByType DEFLATE image/svg+xml',
			'AddOutputFilterByType DEFLATE image/x-icon',
			'AddOutputFilterByType DEFLATE text/css',
			'AddOutputFilterByType DEFLATE text/html',
			'AddOutputFilterByType DEFLATE text/javascript',
			'AddOutputFilterByType DEFLATE text/plain',
			'AddOutputFilterByType DEFLATE text/x-component',
			'AddOutputFilterByType DEFLATE text/xml',
			'</IfModule>',
			'<IfModule mod_headers.c>',
			'Header append Vary: Accept-Encoding',
			'</IfModule>',
		);
		$test_rules    = array();
		foreach ( $swis_rules as $srule ) {
			if ( 0 === strpos( $srule, '#' ) ) {
				continue;
			}
			$test_rules[] = $srule;
		}
		foreach ( $test_rules as $i => $rule ) {
			if ( empty( $current_rules[ $i ] ) || $rule !== $current_rules[ $i ] ) {
				$this->debug_message( "htaccess rule mismatched ($i): $rule" );
				return $swis_rules;
			}
		}
		$this->debug_message( 'htaccess rules up-to-date' );
		return array();
	}

	/**
	 * Check for SWIS rules in .htaccess, and insert if missing/outdated.
	 */
	function insert_htaccess_rules() {
		$this->debug_message( '<b>' . __METHOD__ . '()</b>' );
		$swis_rules = $this->rewrite_verify();
		if ( $swis_rules ) {
			$success = insert_with_markers( $this->get_htaccess_path(), 'SWIS Performance', $swis_rules );
			if ( ! $success ) {
				add_action( 'admin_notices', array( $this, 'htaccess_failure' ) );
			}
		}
	}

	/**
	 * Remove htaccess rules.
	 */
	function remove_htaccess_rules() {
		$this->debug_message( '<b>' . __METHOD__ . '()</b>' );
		$current_rules = extract_from_markers( $this->get_htaccess_path(), 'SWIS Performance' );
		if ( $current_rules ) {
			insert_with_markers( $this->get_htaccess_path(), 'SWIS Performance', '' );
		}
	}
}