View difference between Paste ID: axJ57kD8 and HVsWCxyd
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
}