Leverage Browser Caching

Though my first byte time is awful, I’ve been on the leverage browser caching war path for months now and need to get serious. It’ll probably be obvious, I’m not a pro at this stuff.

I use W3TC and WP Minify. I have four .htaccess files - 1 root, 2 W3TC, 1 WP Minify. My gut is the root file is a car crash, after 1.5 years of trying to learn some things…

AddHandler application/x-httpd-php5s .php

BEGIN .htaccess

#Begin gzip and deflate

AddOutputFilterByType DEFLATE text/html text/css application/x-javascript text/plain text/xml image/x-icon

Set Cache-Control and Expires headers

<filesMatch “\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$”>
Header set Cache-Control “max-age=2592000, private”
Header set Expires “Sun, 17 July 2011 20:00:00 GMT”

<filesMatch “\.(css|css.gz)$”>
Header set Cache-Control “max-age=604800, private”

<filesMatch “\.(js|js.gz)$”>
Header set Cache-Control “max-age=604800, private”

<filesMatch “\.(xml|txt)$”>
Header set Cache-Control “max-age=216000, private, must-revalidate”

<filesMatch “\.(html|htm)$”>
Header set Cache-Control “max-age=7200, private, must-revalidate”

Protect the htaccess file

<Files .htaccess>
Order Allow,Deny
Deny from all

Protect wpconfig.php

Order Allow,Deny Deny from all

Disable directory browsing

For security reasons, Option all cannot be overridden.

#Options All -Indexes
Options ExecCGI Includes IncludesNOEXEC SymLinksIfOwnerMatch -Indexes


# Enable compression AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript text/html text/plain text/xml image/x-icon BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # Make sure proxies deliver correct content Header append Vary User-Agent env=!dont-vary # Ensure proxies deliver compressed content correctly Header append Vary Accept-Encoding # No ETags, No Pragma Header unset Pragma Header unset ETag # Default cache time to 1 year (31536000 sec) Header set Cache-Control "max-age=31536000, public, must-revalidate" # No ETags FileETag none # CACHE SETTINGS (mod_expires) # Turn on Expires ExpiresActive On # set default to "access plus 1 year" ExpiresDefault A31536000 # html - "modification plus 1 hour" ExpiresByType text/html M3600 # css and JavaScript - "modification plus 6 weeks" ExpiresByType text/css M3628800 ExpiresByType text/javascript M3628800 ExpiresByType application/x-javascript M3628800 # No cache for php-files ExpiresActive Off Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform" # END CACHING

W3 Total Cache are here (automatically included by the plugin):

WordPress Default Rules are here (at the end of the file):

END .htaccess

BEGIN W3 Total Cache

SetEnvIfNoCase Accept-Encoding (gzip) APPEND_EXT=.$1 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 /home2/chipurco/public_html/wp-content/w3tc/pgcache/$1/_default_.html%{ENV:APPEND_EXT} -f RewriteRule (.*) wp-content/w3tc/pgcache/$1/_default_.html%{ENV:APPEND_EXT} [L] # END W3 Total Cache RewriteEngine On # If subdomain www exists, remove it first RewriteCond %{HTTP_HOST} ^www.([^.]+.[^.]+)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

If requested resource does not exist as a file

RewriteCond %{REQUEST_FILENAME} !-f

and does not end with a period followed by a filetype

RewriteCond %{REQUEST_URI} !..+$

and does not end with a slash

RewriteCond %{REQUEST_URI} !/$

then add a trailing slash and redirect

RewriteRule (.*) $1/ [R=301,L]

BEGIN W3TC Browser Cache

AddType text/css .css AddType application/x-javascript .js AddType text/html .html .htm AddType text/richtext .rtf .rtx AddType image/svg+xml .svg .svgz AddType text/plain .txt AddType text/xsd .xsd AddType text/xsl .xsl AddType text/xml .xml AddType video/asf .asf .asx .wax .wmv .wmx AddType video/avi .avi AddType image/bmp .bmp AddType application/java .class AddType video/divx .divx AddType application/msword .doc .docx AddType application/x-msdownload .exe AddType image/gif .gif AddType application/x-gzip .gz .gzip AddType image/x-icon .ico AddType image/jpeg .jpg .jpeg .jpe AddType application/vnd.ms-access .mdb AddType audio/midi .mid .midi AddType video/quicktime .mov .qt AddType audio/mpeg .mp3 .m4a AddType video/mp4 .mp4 .m4v AddType video/mpeg .mpeg .mpg .mpe AddType application/vnd.ms-project .mpp AddType application/vnd.oasis.opendocument.database .odb AddType application/vnd.oasis.opendocument.chart .odc AddType application/vnd.oasis.opendocument.formula .odf AddType application/vnd.oasis.opendocument.graphics .odg AddType application/vnd.oasis.opendocument.presentation .odp AddType application/vnd.oasis.opendocument.spreadsheet .ods AddType application/vnd.oasis.opendocument.text .odt AddType audio/ogg .ogg AddType application/pdf .pdf AddType image/png .png AddType application/vnd.ms-powerpoint .pot .pps .ppt .pptx AddType audio/x-realaudio .ra .ram AddType application/x-shockwave-flash .swf AddType application/x-tar .tar AddType image/tiff .tif .tiff AddType audio/wav .wav AddType audio/wma .wma AddType application/vnd.ms-write .wri AddType application/vnd.ms-excel .xla .xls .xlsx .xlt .xlw AddType application/zip .zip ExpiresActive On ExpiresByType text/css A31536000 ExpiresByType application/x-javascript A31536000 ExpiresByType text/html A31536000 ExpiresByType text/richtext A31536000 ExpiresByType image/svg+xml A31536000 ExpiresByType text/plain A31536000 ExpiresByType text/xsd A31536000 ExpiresByType text/xsl A31536000 ExpiresByType text/xml A31536000 ExpiresByType video/asf A31536000 ExpiresByType video/avi A31536000 ExpiresByType image/bmp A31536000 ExpiresByType application/java A31536000 ExpiresByType video/divx A31536000 ExpiresByType application/msword A31536000 ExpiresByType application/x-msdownload A31536000 ExpiresByType image/gif A31536000 ExpiresByType application/x-gzip A31536000 ExpiresByType image/x-icon A31536000 ExpiresByType image/jpeg A31536000 ExpiresByType application/vnd.ms-access A31536000 ExpiresByType audio/midi A31536000 ExpiresByType video/quicktime A31536000 ExpiresByType audio/mpeg A31536000 ExpiresByType video/mp4 A31536000 ExpiresByType video/mpeg A31536000 ExpiresByType application/vnd.ms-project A31536000 ExpiresByType application/vnd.oasis.opendocument.database A31536000 ExpiresByType application/vnd.oasis.opendocument.chart A31536000 ExpiresByType application/vnd.oasis.opendocument.formula A31536000 ExpiresByType application/vnd.oasis.opendocument.graphics A31536000 ExpiresByType application/vnd.oasis.opendocument.presentation A31536000 ExpiresByType application/vnd.oasis.opendocument.spreadsheet A31536000 ExpiresByType application/vnd.oasis.opendocument.text A31536000 ExpiresByType audio/ogg A31536000 ExpiresByType application/pdf A31536000 ExpiresByType image/png A31536000 ExpiresByType application/vnd.ms-powerpoint A31536000 ExpiresByType audio/x-realaudio A31536000 ExpiresByType application/x-shockwave-flash A31536000 ExpiresByType application/x-tar A31536000 ExpiresByType image/tiff A31536000 ExpiresByType audio/wav A31536000 ExpiresByType audio/wma A31536000 ExpiresByType application/vnd.ms-write A31536000 ExpiresByType application/vnd.ms-excel A31536000 ExpiresByType application/zip A31536000 BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html Header append Vary User-Agent env=!dont-vary AddOutputFilterByType DEFLATE text/css application/x-javascript text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon Header set Pragma "public" Header set Cache-Control "public, must-revalidate, proxy-revalidate" FileETag None Header set X-Powered-By "W3 Total Cache/" Header set Pragma "public" Header set Cache-Control "public, must-revalidate, proxy-revalidate" FileETag None Header set X-Powered-By "W3 Total Cache/" Header set Pragma "public" Header set Cache-Control "public, must-revalidate, proxy-revalidate" FileETag None Header set X-Powered-By "W3 Total Cache/" # END W3TC Browser Cache # BEGIN W3TC Page Cache core RewriteEngine On RewriteBase / RewriteRule ^(.*\/)?w3tc_rewrite_test$ $1?w3tc_rewrite_test=1 [L] RewriteCond %{HTTP_USER_AGENT} (2\.0\ mmp|240x320|alcatel|amoi|asus|au\-mic|audiovox|avantgo|benq|bird|blackberry|blazer|cdm|cellphone|danger|ddipocket|docomo|dopod|elaine/3\.0|ericsson|eudoraweb|fly|haier|hiptop|hp\.ipaq|htc|huawei|i\-mobile|iemobile|j\-phone|kddi|konka|kwc|kyocera/wx310k|lenovo|lg|lg/u990|lge\ vx|midp|midp\-2\.0|mmef20|mmp|mobilephone|mot\-v|motorola|netfront|newgen|newt|nintendo\ ds|nintendo\ wii|nitro|nokia|novarra|o2|openweb|opera\ mobi|opera\.mobi|palm|panasonic|pantech|pdxgw|pg|philips|phone|playstation\ portable|portalmmm|ppc|proxinet|psp|pt|qtek|sagem|samsung|sanyo|sch|sec|sendo|sgh|sharp|sharp\-tq\-gx10|sie|small|smartphone|softbank|sonyericsson|sph|symbian|symbian\ os|symbianos|toshiba|treo|ts21i\-10|up\.browser|up\.link|uts|vertu|vodafone|wap|willcome|windows\ ce|windows\.ce|winwap|xda|zte) [NC] RewriteRule .* - [E=W3TC_UA:_low] RewriteCond %{HTTP_USER_AGENT} (acer\ s100|android|archos5|blackberry9500|blackberry9530|blackberry9550|cupcake|docomo\ ht\-03a|dream|htc\ hero|htc\ magic|htc_dream|htc_magic|incognito|ipad|iphone|ipod|lg\-gw620|liquid\ build|maemo|mot\-mb200|mot\-mb300|nexus\ one|opera\ mini|samsung\-s8000|series60.*webkit|series60/5\.0|sonyericssone10|sonyericssonu20|sonyericssonx10|t\-mobile\ mytouch\ 3g|t\-mobile\ opal|tattoo|webmate|webos) [NC] RewriteRule .* - [E=W3TC_UA:_high] RewriteCond %{HTTP_COOKIE} w3tc_referrer=.*(google\.com|yahoo\.com|bing\.com|ask\.com|msn\.com) [NC] RewriteRule .* - [E=W3TC_REF:_search_engines] RewriteCond %{HTTPS} =on RewriteRule .* - [E=W3TC_SSL:_ssl] RewriteCond %{SERVER_PORT} =443 RewriteRule .* - [E=W3TC_SSL:_ssl] RewriteCond %{HTTP:Accept-Encoding} gzip RewriteRule .* - [E=W3TC_ENC:.gzip] RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{QUERY_STRING} ="" RewriteCond %{REQUEST_URI} \/$ [OR] RewriteCond %{REQUEST_URI} (sitemap\.xml(\.gz)?) [NC] RewriteCond %{REQUEST_URI} !(\/wp-admin\/|\/xmlrpc.php|\/wp-(app|cron|login|register|mail)\.php|wp-.*\.php|index\.php|http://chipur.com/forum) [NC,OR] RewriteCond %{REQUEST_URI} (wp-comments-popup\.php|wp-links-opml\.php|wp-locations\.php) [NC] RewriteCond %{HTTP_COOKIE} !(comment_author|wp-postpass|wordpress_\[a-f0-9\]\+|wordpress_logged_in) [NC] RewriteCond %{HTTP_USER_AGENT} !(W3\ Total\ Cache/0\.9\.2\.3|bot|ia_archive|slurp|crawl|spider) [NC] RewriteCond "%{DOCUMENT_ROOT}/wp-content/w3tc/pgcache/%{REQUEST_URI}/_index%{ENV:W3TC_UA}%{ENV:W3TC_REF}%{ENV:W3TC_SSL}.html%{ENV:W3TC_ENC}" -f RewriteRule .* "/wp-content/w3tc/pgcache/%{REQUEST_URI}/_index%{ENV:W3TC_UA}%{ENV:W3TC_REF}%{ENV:W3TC_SSL}.html%{ENV:W3TC_ENC}" [L] # END W3TC Page Cache core # BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]

END WordPress

Any initial guidance re the mess I’m in would be appreciated. Again, I’m thinking my .htaccess file(s) may be the issue.

Thank You…

Have you compared to a clean new wordpress .htaccess? I’d probably just start from scratch (kind of like nuking and re-installing windows when it gets crufty). W3TC should be able to configure the browser caching for you so you shouldn’t need to hand-edit the .htaccess

So I did it and managed not to blow-up my site. Put in a clean .htaccess file with the WP minimum stuff. Hopefully, W3TC will fill in the blanks and I’ll see how I do with page speed, etc.

Thank you so much for the attention…