/** * Generate rules related to prevent for media 404 error by WP * * @param Config $config * @return string */ private function rules_no404wp_generate_apache($config) { $a = $this->get_mime_types(); $cssjs_types = $a['cssjs']; $html_types = $a['html']; $other_types = $a['other']; $extensions = array_merge(array_keys($cssjs_types), array_keys($html_types), array_keys($other_types)); $permalink_structure = get_option('permalink_structure'); $permalink_structure_ext = ltrim(strrchr($permalink_structure, '.'), '.'); if ($permalink_structure_ext != '') { foreach ($extensions as $index => $extension) { if (strstr($extension, $permalink_structure_ext) !== false) { $extensions[$index] = preg_replace('~\\|?' . Util_Environment::preg_quote($permalink_structure_ext) . '\\|?~', '', $extension); } } } $exceptions = $config->get_array('browsercache.no404wp.exceptions'); $wp_uri = network_home_url('', 'relative'); $wp_uri = rtrim($wp_uri, '/'); $rules = ''; $rules .= W3TC_MARKER_BEGIN_BROWSERCACHE_NO404WP . "\n"; $rules .= "<IfModule mod_rewrite.c>\n"; $rules .= " RewriteEngine On\n"; // in subdir - rewrite theme files and similar to upper folder if file exists if (Util_Environment::is_wpmu() && !Util_Environment::is_wpmu_subdomain()) { $rules .= " RewriteCond %{REQUEST_FILENAME} !-f\n"; $rules .= " RewriteCond %{REQUEST_FILENAME} !-d\n"; $rules .= " RewriteCond %{REQUEST_URI} ^{$wp_uri}/([_0-9a-zA-Z-]+/)(.*\\.)(" . implode('|', $extensions) . ")\$ [NC]\n"; $document_root = Util_Rule::apache_docroot_variable(); $rules .= ' RewriteCond "' . $document_root . $wp_uri . '/%2%3" -f' . "\n"; $rules .= " RewriteRule .* {$wp_uri}/%2%3 [L]\n\n"; } $rules .= " RewriteCond %{REQUEST_FILENAME} !-f\n"; $rules .= " RewriteCond %{REQUEST_FILENAME} !-d\n"; $imploded = implode('|', $exceptions); if (!empty($imploded)) { $rules .= " RewriteCond %{REQUEST_URI} !(" . $imploded . ")\n"; } $rules .= " RewriteCond %{REQUEST_URI} \\.(" . implode('|', $extensions) . ")\$ [NC]\n"; $rules .= " RewriteRule .* - [L]\n"; $rules .= "</IfModule>\n"; $rules .= W3TC_MARKER_END_BROWSERCACHE_NO404WP . "\n"; return $rules; }
/** * Generates rules for WP dir * * @param Config $config * @return string */ private function rules_core_generate_apache($config) { $rewrite_base = Util_Environment::network_home_url_uri(); $cache_dir = Util_Environment::normalize_path(W3TC_CACHE_PAGE_ENHANCED_DIR); $permalink_structure = get_option('permalink_structure'); $current_user = get_currentuserinfo(); /** * Auto reject cookies */ $reject_cookies = array('comment_author', 'wp-postpass'); if ($config->get_string('pgcache.engine') == 'file_generic') { $reject_cookies[] = 'w3tc_logged_out'; } /** * Reject cache for logged in users * OR * Reject cache for roles if any */ if ($config->get_boolean('pgcache.reject.logged')) { $reject_cookies = array_merge($reject_cookies, array('wordpress_logged_in')); } elseif ($config->get_boolean('pgcache.reject.logged_roles')) { $new_cookies = array(); foreach ($config->get_array('pgcache.reject.roles') as $role) { $new_cookies[] = 'w3tc_logged_' . md5(NONCE_KEY . $role); } $reject_cookies = array_merge($reject_cookies, $new_cookies); } /** * Custom config */ $reject_cookies = array_merge($reject_cookies, $config->get_array('pgcache.reject.cookie')); Util_Rule::array_trim($reject_cookies); $reject_user_agents = $config->get_array('pgcache.reject.ua'); if ($config->get_boolean('pgcache.compatibility')) { $reject_user_agents = array_merge(array(W3TC_POWERED_BY), $reject_user_agents); } Util_Rule::array_trim($reject_user_agents); /** * Generate directives */ $env_W3TC_UA = ''; $env_W3TC_REF = ''; $env_W3TC_SSL = ''; $env_W3TC_ENC = ''; $rules = ''; $rules .= W3TC_MARKER_BEGIN_PGCACHE_CORE . "\n"; $rules .= "<IfModule mod_rewrite.c>\n"; $rules .= " RewriteEngine On\n"; $rules .= " RewriteBase " . $rewrite_base . "\n"; if ($config->get_boolean('pgcache.debug')) { $rules .= " RewriteRule ^(.*\\/)?w3tc_rewrite_test([0-9]+)/?\$ \$1?w3tc_rewrite_test=1 [L]\n"; } /** * Check for mobile redirect */ if ($config->get_boolean('mobile.enabled')) { $mobile_groups = $config->get_array('mobile.rgroups'); foreach ($mobile_groups as $mobile_group => $mobile_config) { $mobile_enabled = isset($mobile_config['enabled']) ? (bool) $mobile_config['enabled'] : false; $mobile_agents = isset($mobile_config['agents']) ? (array) $mobile_config['agents'] : ''; $mobile_redirect = isset($mobile_config['redirect']) ? $mobile_config['redirect'] : ''; if ($mobile_enabled && count($mobile_agents) && $mobile_redirect) { $rules .= " RewriteCond %{HTTP_USER_AGENT} (" . implode('|', $mobile_agents) . ") [NC]\n"; $rules .= " RewriteRule .* " . $mobile_redirect . " [R,L]\n"; } } } /** * Check for referrer redirect */ if ($config->get_boolean('referrer.enabled')) { $referrer_groups = $config->get_array('referrer.rgroups'); foreach ($referrer_groups as $referrer_group => $referrer_config) { $referrer_enabled = isset($referrer_config['enabled']) ? (bool) $referrer_config['enabled'] : false; $referrer_referrers = isset($referrer_config['referrers']) ? (array) $referrer_config['referrers'] : ''; $referrer_redirect = isset($referrer_config['redirect']) ? $referrer_config['redirect'] : ''; if ($referrer_enabled && count($referrer_referrers) && $referrer_redirect) { $rules .= " RewriteCond %{HTTP_COOKIE} w3tc_referrer=.*(" . implode('|', $referrer_referrers) . ") [NC]\n"; $rules .= " RewriteRule .* " . $referrer_redirect . " [R,L]\n"; } } } /** * Set mobile groups */ if ($config->get_boolean('mobile.enabled')) { $mobile_groups = array_reverse($config->get_array('mobile.rgroups')); foreach ($mobile_groups as $mobile_group => $mobile_config) { $mobile_enabled = isset($mobile_config['enabled']) ? (bool) $mobile_config['enabled'] : false; $mobile_agents = isset($mobile_config['agents']) ? (array) $mobile_config['agents'] : ''; $mobile_redirect = isset($mobile_config['redirect']) ? $mobile_config['redirect'] : ''; if ($mobile_enabled && count($mobile_agents) && !$mobile_redirect) { $rules .= " RewriteCond %{HTTP_USER_AGENT} (" . implode('|', $mobile_agents) . ") [NC]\n"; $rules .= " RewriteRule .* - [E=W3TC_UA:_" . $mobile_group . "]\n"; $env_W3TC_UA = '%{ENV:W3TC_UA}'; } } } /** * Set referrer groups */ if ($config->get_boolean('referrer.enabled')) { $referrer_groups = array_reverse($config->get_array('referrer.rgroups')); foreach ($referrer_groups as $referrer_group => $referrer_config) { $referrer_enabled = isset($referrer_config['enabled']) ? (bool) $referrer_config['enabled'] : false; $referrer_referrers = isset($referrer_config['referrers']) ? (array) $referrer_config['referrers'] : ''; $referrer_redirect = isset($referrer_config['redirect']) ? $referrer_config['redirect'] : ''; if ($referrer_enabled && count($referrer_referrers) && !$referrer_redirect) { $rules .= " RewriteCond %{HTTP_COOKIE} w3tc_referrer=.*(" . implode('|', $referrer_referrers) . ") [NC]\n"; $rules .= " RewriteRule .* - [E=W3TC_REF:_" . $referrer_group . "]\n"; $env_W3TC_REF = '%{ENV:W3TC_REF}'; } } } /** * Set HTTPS */ if ($config->get_boolean('pgcache.cache.ssl')) { $rules .= " RewriteCond %{HTTPS} =on\n"; $rules .= " RewriteRule .* - [E=W3TC_SSL:_ssl]\n"; $rules .= " RewriteCond %{SERVER_PORT} =443\n"; $rules .= " RewriteRule .* - [E=W3TC_SSL:_ssl]\n"; $env_W3TC_SSL = '%{ENV:W3TC_SSL}'; } $cache_path = str_replace(Util_Environment::document_root(), '', $cache_dir); /** * Set Accept-Encoding */ if ($config->get_boolean('browsercache.enabled') && $config->get_boolean('browsercache.html.compression')) { $rules .= " RewriteCond %{HTTP:Accept-Encoding} gzip\n"; $rules .= " RewriteRule .* - [E=W3TC_ENC:_gzip]\n"; $env_W3TC_ENC = '%{ENV:W3TC_ENC}'; } $rules .= " RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]\n"; $rules .= " RewriteRule .* - [E=W3TC_PREVIEW:_preview]\n"; $env_W3TC_PREVIEW = '%{ENV:W3TC_PREVIEW}'; $use_cache_rules = ''; /** * Don't accept POSTs */ $use_cache_rules .= " RewriteCond %{REQUEST_METHOD} !=POST\n"; /** * Query string should be empty */ $use_cache_rules .= " RewriteCond %{QUERY_STRING} =\"\"\n"; /** * Check permalink structure trailing slash */ if (substr($permalink_structure, -1) == '/') { $use_cache_rules .= " RewriteCond %{REQUEST_URI} \\/\$\n"; } /** * Check for rejected cookies */ $use_cache_rules .= " RewriteCond %{HTTP_COOKIE} !(" . implode('|', array_map(array('\\W3TC\\Util_Environment', 'preg_quote'), $reject_cookies)) . ") [NC]\n"; /** * Check for rejected user agents */ if (count($reject_user_agents)) { $use_cache_rules .= " RewriteCond %{HTTP_USER_AGENT} !(" . implode('|', array_map(array('\\W3TC\\Util_Environment', 'preg_quote'), $reject_user_agents)) . ") [NC]\n"; } /** * Make final rewrites for specific files */ $uri_prefix = $cache_path . '/%{HTTP_HOST}/%{REQUEST_URI}/' . '_index' . $env_W3TC_UA . $env_W3TC_REF . $env_W3TC_SSL . $env_W3TC_PREVIEW; $switch = " -" . ($config->get_boolean('pgcache.file.nfs') ? 'F' : 'f'); $document_root = Util_Rule::apache_docroot_variable(); // write rule to rewrite to .html file $ext = '.html'; $rules .= $use_cache_rules; $rules .= " RewriteCond \"" . $document_root . $uri_prefix . $ext . $env_W3TC_ENC . "\"" . $switch . "\n"; $rules .= " RewriteRule .* \"" . $uri_prefix . $ext . $env_W3TC_ENC . "\" [L]\n"; $rules .= "</IfModule>\n"; $rules .= W3TC_MARKER_END_PGCACHE_CORE . "\n"; return $rules; }