Created
December 4, 2013 22:26
-
-
Save trabulium/7796744 to your computer and use it in GitHub Desktop.
Basic Magento Varnish default.vcl for use with Phoenix Varnish
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is a basic VCL configuration file for PageCache powered by Varnish for Magento module. | |
# default backend definition. Set this to point to your content server. | |
backend default { | |
.host = "127.0.0.1"; | |
.port = "8000"; | |
.first_byte_timeout = 300s; | |
} | |
# add your Magento server IP to allow purges from the backend | |
acl purge { | |
"localhost"; | |
"127.0.0.1"; | |
} | |
sub vcl_recv { | |
# uncomment below line if you need to disable varnish | |
#return(pass); | |
if ( req.url ~ ".*/shop/shipping/tracking/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/checkout/cart/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/blog/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/mageadmin/sales_order/pdfinvoices/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/mageadmin/sales_invoice/pdfinvoices/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/mageadmin/sales_order_invoice/print/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/gomage_feed/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/mageadmin/xPos/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/index.php/mageadmin/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if ( req.url ~ ".*/downloader/.*" ) { | |
set req.http.connection = "close"; | |
return(pipe); | |
} | |
if (req.restarts == 0) { | |
if (req.http.x-forwarded-for) { | |
set req.http.X-Forwarded-For = | |
req.http.X-Forwarded-For + ", " + client.ip; | |
} else { | |
set req.http.X-Forwarded-For = client.ip; | |
} | |
} | |
if (req.request != "GET" && | |
req.request != "HEAD" && | |
req.request != "PUT" && | |
req.request != "POST" && | |
req.request != "TRACE" && | |
req.request != "OPTIONS" && | |
req.request != "DELETE" && | |
req.request != "PURGE") { | |
/* Non-RFC2616 or CONNECT which is weird. */ | |
return (pipe); | |
} | |
# purge request | |
if (req.request == "PURGE") { | |
if (!client.ip ~ purge) { | |
error 405 "Not allowed."; | |
} | |
ban("obj.http.X-Purge-Host ~ " + req.http.X-Purge-Host + " && obj.http.X-Purge-URL ~ " + req.http.X-Purge-Regex + " && obj.http.Content-Type ~ " + req.http.X-Purge-Content-Type); | |
error 200 "Purged."; | |
} | |
# we only deal with GET and HEAD by default | |
if (req.request != "GET" && req.request != "HEAD") { | |
return (pass); | |
} | |
# static files are always cacheable. remove SSL flag and cookie | |
if (req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$") { | |
unset req.http.Https; | |
unset req.http.Cookie; | |
} | |
# not cacheable by default | |
if (req.http.Authorization || req.http.Https) { | |
return (pass); | |
} | |
# do not cache any page from | |
# - index files | |
# - ... | |
#if (req.url ~ "^/(index)") { | |
# return (pass); | |
#} | |
# as soon as we have a NO_CACHE cookie pass request | |
if (req.http.cookie ~ "NO_CACHE=") { | |
return (pass); | |
} | |
# normalize Aceept-Encoding header | |
# http://varnish.projects.linpro.no/wiki/FAQ/Compression | |
if (req.http.Accept-Encoding) { | |
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") { | |
# No point in compressing these | |
remove req.http.Accept-Encoding; | |
} elsif (req.http.Accept-Encoding ~ "gzip") { | |
set req.http.Accept-Encoding = "gzip"; | |
} elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") { | |
set req.http.Accept-Encoding = "deflate"; | |
} else { | |
# unkown algorithm | |
remove req.http.Accept-Encoding; | |
} | |
} | |
# remove Google gclid parameters | |
set req.url = regsuball(req.url,"\?gclid=[^&]+$",""); # strips when QS = "?gclid=AAA" | |
set req.url = regsuball(req.url,"\?gclid=[^&]+&","?"); # strips when QS = "?gclid=AAA&foo=bar" | |
set req.url = regsuball(req.url,"&gclid=[^&]+",""); # strips when QS = "?foo=bar&gclid=AAA" or QS = "?foo=bar&gclid=AAA&bar=baz" | |
return (lookup); | |
} | |
# sub vcl_pipe { | |
# # Note that only the first request to the backend will have | |
# # X-Forwarded-For set. If you use X-Forwarded-For and want to | |
# # have it set for all requests, make sure to have: | |
# # set bereq.http.connection = "close"; | |
# # here. It is not set by default as it might break some broken web | |
# # applications, like IIS with NTLM authentication. | |
# return (pipe); | |
# } | |
# | |
# sub vcl_pass { | |
# return (pass); | |
# } | |
# | |
sub vcl_hash { | |
hash_data(req.url); | |
if (req.http.host) { | |
hash_data(req.http.host); | |
} else { | |
hash_data(server.ip); | |
} | |
if (!(req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$")) { | |
call design_exception; | |
} | |
return (hash); | |
} | |
# | |
# sub vcl_hit { | |
# return (deliver); | |
# } | |
# | |
# sub vcl_miss { | |
# return (fetch); | |
# } | |
sub vcl_fetch { | |
if (beresp.status == 500) { | |
set beresp.saintmode = 10s; | |
return (restart); | |
} | |
set beresp.grace = 5m; | |
# add ban-lurker tags to object | |
set beresp.http.X-Purge-URL = req.url; | |
set beresp.http.X-Purge-Host = req.http.host; | |
if (beresp.status == 200 || beresp.status == 301 || beresp.status == 404) { | |
if (beresp.http.Content-Type ~ "text/html" || beresp.http.Content-Type ~ "text/xml") { | |
if ((beresp.http.Set-Cookie ~ "NO_CACHE=") || (beresp.ttl < 1s)) { | |
set beresp.ttl = 0s; | |
return (hit_for_pass); | |
} | |
# marker for vcl_deliver to reset Age: | |
set beresp.http.magicmarker = "1"; | |
# Don't cache cookies | |
unset beresp.http.set-cookie; | |
} else { | |
# set default TTL value for static content | |
set beresp.ttl = 4h; | |
} | |
return (deliver); | |
} | |
return (hit_for_pass); | |
} | |
sub vcl_deliver { | |
# debug info | |
if (resp.http.X-Cache-Debug) { | |
if (obj.hits > 0) { | |
set resp.http.X-Cache = "HIT"; | |
set resp.http.X-Cache-Hits = obj.hits; | |
} else { | |
set resp.http.X-Cache = "MISS"; | |
} | |
set resp.http.X-Cache-Expires = resp.http.Expires; | |
} else { | |
# remove Varnish/proxy header | |
remove resp.http.X-Varnish; | |
remove resp.http.Via; | |
remove resp.http.Age; | |
remove resp.http.X-Purge-URL; | |
remove resp.http.X-Purge-Host; | |
} | |
if (resp.http.magicmarker) { | |
# Remove the magic marker | |
unset resp.http.magicmarker; | |
set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; | |
set resp.http.Pragma = "no-cache"; | |
set resp.http.Expires = "Mon, 31 Mar 2008 10:00:00 GMT"; | |
set resp.http.Age = "0"; | |
} | |
} | |
# sub vcl_error { | |
# set obj.http.Content-Type = "text/html; charset=utf-8"; | |
# set obj.http.Retry-After = "5"; | |
# synthetic {" | |
# <?xml version="1.0" encoding="utf-8"?> | |
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |
# "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
# <html> | |
# <head> | |
# <title>"} + obj.status + " " + obj.response + {"</title> | |
# </head> | |
# <body> | |
# <h1>Error "} + obj.status + " " + obj.response + {"</h1> | |
# <p>"} + obj.response + {"</p> | |
# <h3>Guru Meditation:</h3> | |
# <p>XID: "} + req.xid + {"</p> | |
# <hr> | |
# <p>Varnish cache server</p> | |
# </body> | |
# </html> | |
# "}; | |
# return (deliver); | |
# } | |
# | |
# sub vcl_init { | |
# return (ok); | |
# } | |
# | |
# sub vcl_fini { | |
# return (ok); | |
# } | |
sub design_exception { | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment