W3 Total Cache is a wonderful cache plugin for WordPress that decrease server load by serving cached (static HTML) files. I'm using it in all my blogs. It works properly except one thing that I discovered today. The problem is when I type my domain without "www", W3 Total Cache redirects to a weird URL like /wp-content/w3tc/pgcache/_default_.html.gzip
instead of the root URL with "www". This problem comes from the .htaccess
file that W3 Total Cache has modified.
Here is my original .htaccess
file before using W3 Total Cache (I removed some other rules except redirections):
RewriteEngine On RewriteBase / # Redirect all others domain names to with www RewriteCond %{HTTP_HOST} !^www.domain.tld [NC] RewriteRule ^(.*)$ [R=301,L] # BEGIN WordPress RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
There're only 2 basic rules: one for redirection from non-www URLs to www URLs and one is WordPress's. Without installing W3 Total Cache, these redirections work nicely.
After installing W3 Total Cache, it automatically adds to the beginning of .htaccess
file some lines that look like this:
# BEGIN W3 Total Cache <IfModule mod_setenvif.c> SetEnvIfNoCase Accept-Encoding (gzip) APPEND_EXT=.$1 </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} /$ RewriteCond %{REQUEST_URI} !(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register).php|wp-.*.php|index.php) [OR] RewriteCond %{REQUEST_URI} (wp-comments-popup.php|wp-links-opml.php|wp-locations.php) [NC] RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{QUERY_STRING} ="" RewriteCond %{HTTP_COOKIE} !(comment_author|wp-postpass|wordpress_[a-f0-9]+|wordpress_logged_in) [NC] RewriteCond %{HTTP_USER_AGENT} !(bot|ia_archive|slurp|crawl|spider) [NC] RewriteCond /home/rilwis/public_html/mysite/wp-content/w3tc/pgcache/$1/_default_.html%{ENV:APPEND_EXT} -f RewriteRule (.*) wp-content/w3tc/pgcache/$1/_default_.html%{ENV:APPEND_EXT} [L] </IfModule> # END W3 Total Cache
This looks complicated! But take a look at the last line (RewriteRule), you'll see the URL that displayed in the address bar when page is redirected.
This rule is executed before the redirection from non-www to www. So I guess the problem is their order. Remember that W3 Total Cache put its rule in the beginning of .htaccess. So all I need to do is just move them to the very bottom of .htaccess file. And it works!
Now when I type non-www URL in the address bar, browser will be redirected properly to www URL as I'm respected. And W3 Total Cache still does its cache job wonderfully.
Leave a Reply