SHOW:
|
|
- or go back to the newest paste.
1 | ## Redirect requests to Apache, running on port 8000 on localhost | |
2 | backend apache { | |
3 | .host = "127.0.0.1"; | |
4 | .port = "8000"; | |
5 | } | |
6 | ||
7 | acl purge { | |
8 | "localhost"; | |
9 | "127.0.0.1"; | |
10 | "127.0.1.1"; | |
11 | "testing.domain.com"; | |
12 | } | |
13 | ||
14 | sub vcl_recv { | |
15 | ||
16 | # remove ?ver=xxxxx strings from urls so css and js files are cached. | |
17 | # Watch out when upgrading WordPress, need to restart Varnish or flush cache. | |
18 | - | # set req.url = regsub(req.url, "\?ver=.*$", ""); |
18 | + | set req.url = regsub(req.url, "\?ver=.*$", ""); |
19 | ||
20 | # Remove "replytocom" from requests to make caching better. | |
21 | - | # set req.url = regsub(req.url, "\?replytocom=.*$", ""); |
21 | + | set req.url = regsub(req.url, "\?replytocom=.*$", ""); |
22 | ||
23 | - | # remove req.http.X-Forwarded-For; |
23 | + | remove req.http.X-Forwarded-For; |
24 | - | # set req.http.X-Forwarded-For = client.ip; |
24 | + | set req.http.X-Forwarded-For = client.ip; |
25 | ||
26 | ## If the request to the backend returns a code other than 200, restart the loop | |
27 | ## If the number of restarts reaches the value of the parameter max_restarts, | |
28 | ## the request will be error'ed. max_restarts defaults to 4. This prevents | |
29 | ## an eternal loop in the event that, e.g., the object does not exist at all. | |
30 | # if (beresp.status != 200 && beresp.status != 403 && beresp.status != 404) { | |
31 | # return(restart); | |
32 | # } | |
33 | ||
34 | # Exclude this site because it breaks if cached | |
35 | #if ( req.http.host == "testing.domain.com" ) { | |
36 | # return( pass ); | |
37 | #} | |
38 | ||
39 | # Serve objects up to 2 minutes past their expiry if the backend is slow to respond. | |
40 | set req.grace = 120s; | |
41 | ||
42 | # Strip cookies for static files: | |
43 | - | # if (req.url ~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$") { |
43 | + | if (req.url ~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$") { |
44 | - | # unset req.http.Cookie; |
44 | + | unset req.http.Cookie; |
45 | - | # return(lookup); |
45 | + | return(lookup); |
46 | } | |
47 | ||
48 | # Remove has_js and Google Analytics __* cookies. | |
49 | - | # set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", ""); |
49 | + | set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", ""); |
50 | ||
51 | # Remove a ";" prefix, if present. | |
52 | - | # set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); |
52 | + | set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); |
53 | ||
54 | # Remove empty cookies. | |
55 | - | # if (req.http.Cookie ~ "^\s*$") { |
55 | + | if (req.http.Cookie ~ "^\s*$") { |
56 | - | # unset req.http.Cookie; |
56 | + | unset req.http.Cookie; |
57 | } | |
58 | ||
59 | if (req.request == "PURGE") { | |
60 | if (!client.ip ~ purge) { | |
61 | error 405 "Not allowed."; | |
62 | } | |
63 | return (lookup); | |
64 | } | |
65 | ||
66 | if (req.request == "BAN") { | |
67 | if (!client.ip ~ purge) { | |
68 | error 405 "Not allowed."; | |
69 | } | |
70 | ban("req.url ~ " + req.url + " && req.http.host == " + req.http.host); | |
71 | error 200 "Ban added"; | |
72 | } | |
73 | ||
74 | # Pass anything other than GET and HEAD directly. | |
75 | if (req.request != "GET" && req.request != "HEAD") { | |
76 | return( pass ); | |
77 | } /* We only deal with GET and HEAD by default */ | |
78 | ||
79 | # remove cookies for comments cookie to make caching better. | |
80 | - | # set req.http.cookie = regsub(req.http.cookie, "1231111111111111122222222333333=[^;]+(; )?", ""); |
80 | + | set req.http.cookie = regsub(req.http.cookie, "1231111111111111122222222333333=[^;]+(; )?", ""); |
81 | ||
82 | # never cache the admin pages, or the server-status page | |
83 | if (req.request == "GET" && (req.url ~ "(wp-admin|bb-admin|server-status|feed)")) { | |
84 | return(pipe); | |
85 | } | |
86 | # don't cache authenticated sessions | |
87 | if (req.http.Cookie && req.http.Cookie ~ "(wordpress_|PHPSESSID)") { | |
88 | return(pass); | |
89 | } | |
90 | # don't cache ajax requests | |
91 | if(req.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache" || req.url ~ "(control.php|wp-comments-post.php|wp-login.php|bb-login.php|bb-reset-password.php|register.php)") { | |
92 | return (pass); | |
93 | } | |
94 | return( lookup ); | |
95 | } | |
96 | ||
97 | sub vcl_hash { | |
98 | # Each cached page has to be identified by a key that unlocks it. | |
99 | # Add the browser cookie only if a WordPress cookie found. | |
100 | if ( req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_)" ) { | |
101 | #if (req.http.Cookie) { | |
102 | #set req.hash += req.http.Cookie; | |
103 | hash_data(req.http.Cookie); | |
104 | } | |
105 | } | |
106 | ||
107 | # Called after a document has been successfully retrieved from the backend. | |
108 | sub vcl_fetch { | |
109 | ||
110 | # Uncomment to make the default cache "time to live" is 5 minutes, handy | |
111 | # but it may cache stale pages unless purged. (TODO) | |
112 | # By default Varnish will use the headers sent to it by Apache (the backend server) | |
113 | # to figure out the correct TTL. | |
114 | # WP Super Cache sends a TTL of 3 seconds, set in wp-content/cache/.htaccess | |
115 | ||
116 | set beresp.ttl = 24h; | |
117 | ||
118 | # Strip cookies for static files and set a long cache expiry time. | |
119 | if (req.url ~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$") { | |
120 | unset beresp.http.set-cookie; | |
121 | set beresp.ttl = 24h; | |
122 | } | |
123 | ||
124 | # If WordPress cookies found then page is not cacheable | |
125 | if (req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_)") { | |
126 | # set beresp.cacheable = false;#versions less than 3 | |
127 | #beresp.ttl>0 is cacheable so 0 will not be cached | |
128 | set beresp.ttl = 0s; | |
129 | } else { | |
130 | # set beresp.cacheable = true; | |
131 | set beresp.ttl=24h; #cache for 24hrs | |
132 | } | |
133 | ||
134 | # Varnish determined the object was not cacheable | |
135 | if (!beresp.ttl > 0s) { | |
136 | set beresp.http.X-Cacheable = "NO:Not Cacheable"; | |
137 | } else if ( req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_|UserID|_session)" ) { | |
138 | # You don't wish to cache content for logged in users | |
139 | set beresp.http.X-Cacheable = "NO:Got Session"; | |
140 | return(hit_for_pass); | |
141 | } else if ( beresp.http.Cache-Control ~ "private") { | |
142 | # You are respecting the Cache-Control=private header from the backend | |
143 | set beresp.http.X-Cacheable = "NO:Cache-Control=private"; | |
144 | return(hit_for_pass); | |
145 | } else if ( beresp.ttl < 1s ) { | |
146 | # You are extending the lifetime of the object artificially | |
147 | set beresp.ttl = 300s; | |
148 | set beresp.grace = 300s; | |
149 | set beresp.http.X-Cacheable = "YES:Forced"; | |
150 | } else { | |
151 | # Varnish determined the object was cacheable | |
152 | set beresp.http.X-Cacheable = "YES"; | |
153 | } | |
154 | ||
155 | if (beresp.status == 404 || beresp.status >= 500) { | |
156 | set beresp.ttl = 0s; | |
157 | } | |
158 | ||
159 | ## Remove the X-Forwarded-For header if it exists. | |
160 | remove req.http.X-Forwarded-For; | |
161 | ||
162 | ## insert the client IP address as X-Forwarded-For. This is the normal IP address of the user. | |
163 | set req.http.X-Forwarded-For = req.http.rlnclientipaddr; | |
164 | ||
165 | ## Added security, the "w00tw00t" attacks are pretty annoying so lets block it before it reaches our webserver | |
166 | if (req.url ~ "^/w00tw00t") { | |
167 | error 403 "Not permitted"; | |
168 | } | |
169 | ||
170 | if (req.url ~ "^/phpmyadmin") {error 403;} | |
171 | if (req.url ~ "^/PhpMyAdmin") {error 403;} | |
172 | if (req.url ~ "^/databases") {error 403;} | |
173 | if (req.url ~ "^/pma") {error 403;} | |
174 | if (req.url ~ "^/Toata") {error 403;} | |
175 | ||
176 | ## Deliver the content | |
177 | return(deliver); | |
178 | } | |
179 | ||
180 | ## Deliver | |
181 | #sub vcl_deliver { | |
182 | ## We'll be hiding some headers added by Varnish. We want to make sure people are not seeing we're using Varnish. | |
183 | ## Since we're not caching (yet), why bother telling people we use it? | |
184 | #remove resp.http.X-Varnish; | |
185 | #remove resp.http.Via; | |
186 | #remove resp.http.Age; | |
187 | ||
188 | ## We'd like to hide the X-Powered-By headers. Nobody has to know we can run PHP and have version xyz of it. | |
189 | #remove resp.http.X-Powered-By; | |
190 | #} | |
191 | ||
192 | sub vcl_deliver { | |
193 | // Debugging | |
194 | if (obj.hits > 0) { | |
195 | set resp.http.X-Cache = "HIT"; | |
196 | } else { | |
197 | set resp.http.X-Cache = "MISS"; | |
198 | } | |
199 | ||
200 | // Remove some headers: PHP version | |
201 | unset resp.http.X-Powered-By; | |
202 | ||
203 | // Remove some headers: Apache version & OS | |
204 | unset resp.http.Server; | |
205 | ||
206 | return (deliver); | |
207 | } | |
208 | ||
209 | sub vcl_error { | |
210 | set obj.http.Content-Type = "text/html; charset=utf-8"; | |
211 | set obj.http.Retry-After = "5"; | |
212 | synthetic {" | |
213 | <?xml version="1.0" encoding="utf-8"?> | |
214 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |
215 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
216 | <html> | |
217 | <head> | |
218 | <title>"} + obj.status + " " + obj.response + {"</title> | |
219 | </head> | |
220 | <body> | |
221 | <h1>Error "} + obj.status + " " + obj.response + {"</h1> | |
222 | <p>"} + obj.response + {"</p> | |
223 | <h3>Guru Meditation:</h3> | |
224 | <p>XID: "} + req.xid + {"</p> | |
225 | <hr> | |
226 | <p>Varnish cache server</p> | |
227 | </body> | |
228 | </html> | |
229 | "}; | |
230 | return (deliver); | |
231 | } |