1

Currently W3 Total Cache use cached page only if query string is empty, the rule is:

RewriteCond %{QUERY_STRING} =""

in this code (from .htaccess):

# BEGIN W3TC Page Cache core
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteRule .* - [E=W3TC_ENC:_gzip]
    RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]
    RewriteRule .* - [E=W3TC_PREVIEW:_preview]
    RewriteCond %{REQUEST_METHOD} !=POST
    RewriteCond %{QUERY_STRING} =""
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_COOKIE} !(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
    RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" -f
    RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" [L]

</IfModule>
# END W3TC Page Cache core

I want override this logic and use cache with ignorable parameters like utm_source, utm_medium, utm_term, utm_content, utm_campaign and gcli.

I have wrote this code:

# BEGIN Override W3TC Page Cache core
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# copy QUERY_STRING in env var
RewriteRule ^ - [E=CustomQueryString:%{QUERY_STRING}]

# delete utm_source param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_source=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# delete utm_medium param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_medium=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# delete utm_term param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_term=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# delete utm_content param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_content=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# delete utm_campaign param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_campaign=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# delete gclid param
RewriteCond %{ENV:CustomQueryString} ^(.*)&?gclid=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# if %{ENV:CustomQueryString} is empty cached pare are served
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteRule .* - [E=W3TC_ENC:_gzip]
RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]
RewriteRule .* - [E=W3TC_PREVIEW:_preview]

RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{ENV:CustomQueryString} =""
RewriteCond %{REQUEST_URI} \/$
RewriteCond %{HTTP_COOKIE} !(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" -f
RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" [L]

</IfModule>
# END Override W3TC Page Cache core

My code work! and i'm happy! Now, request with this paramenter are served with cached pages using the server's URL rewriting capabilities, skipping PHP and WordPress entirely. It's faster and more efficient.

The question is: Are my snippet safe for W3TC Page Cache?

1
  • 3
    Good question, but we can't possibly answer it here because third party plugins are off-topic (given there are tens of thousands of them, we aren't experts in them all :)). I would suggest asking this at the Wordpress.org support forum for W3 Total Cache. Or even suggesting it as an optional enhancement to the plugin...
    – Tim Malone
    Commented Jun 26, 2016 at 20:24

0