forked from ding2/ding2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ding2_v4.vcl
211 lines (185 loc) · 7.03 KB
/
ding2_v4.vcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
vcl 4.0;
import std;
backend default {
.host = "127.0.0.1";
.port = "80";
}
# List of upstream proxies we trust to set X-Forwarded-For correctly.
acl upstream_proxy {
"127.0.0.1";
"172.21.0.0"/24;
}
# Respond to incoming requests.
sub vcl_recv {
# Make sure that the client ip is forward to the client.
if (req.restarts == 0) {
if (client.ip ~ upstream_proxy && 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.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
# Ensure that ding_wayf and SimpleSAMLphp is not cached.
if (req.url ~ "^/wayf" || req.url ~ "^/ding-redia-rss" || req.url ~ "^/survey" || req.url ~ "^/gatewayf" || req.url ~ "^/feeds/eventdb") {
return (pipe);
}
# We'll always restart once. Therefore, when restarts == 0 we can ensure
# that the HTTP headers haven't been tampered with by the client.
if (req.restarts == 0) {
unset req.http.X-Drupal-Roles;
# We're going to change the URL to x-drupal-roles so we'll need to save
# the original one first.
set req.http.X-Original-URL = req.url;
set req.url = "/varnish/roles";
return (hash);
}
# Do not cache these paths.
if (req.url ~ "^/status\.php$" ||
req.url ~ "^/update\.php$" ||
req.url ~ "^/admin/build/features" ||
req.url ~ "^/info/.*$" ||
req.url ~ "^/flag/.*$" ||
req.url ~ "^.*/ajax/.*$" ||
req.url ~ "^.*/ahah/.*$" ||
req.url ~ "^.*/edit.*$" ||
req.url ~ "^.*/ding_availability.*$") {
return (pass);
}
# Pipe these paths directly to Apache for streaming.
if (req.url ~ "^/admin/content/backup_migrate/export") {
return (pipe);
}
# Use anonymous, cached pages if all backends are down.
if (!std.healthy(req.backend_hint)) {
unset req.http.Cookie;
}
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?[\w\d=\.\-]+)?$") {
unset req.http.Cookie;
}
# Remove all cookies that Drupal doesn't need to know about. ANY remaining
# cookie will cause the request to pass-through to Apache. For the most part
# we always set the NO_CACHE cookie after any POST request, disabling the
# Varnish cache temporarily. Cookies are only removed for not logged in users
# theme with role 1 (anonymous user).
if (req.http.Cookie && req.http.X-Drupal-Roles == "1") {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(SSESS[a-z0-9]+|NO_CACHE)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|NO_CACHE)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
if (req.http.Cookie == "") {
# If there are no remaining cookies, remove the cookie header. If there
# aren't any cookie headers, Varnish's default behavior will be to cache
# the page.
unset req.http.Cookie;
}
else {
# If there are any cookies left (a session or NO_CACHE cookie), do not
# cache the page. Pass it on to Apache directly.
return (pass);
}
}
# Handle compression correctly. Different browsers send different
# "Accept-Encoding" headers, even though they mostly all support the same
# compression mechanisms. By consolidating these compression headers into
# a consistent format, we can reduce the size of the cache and get more hits.
# @see: http:// varnish.projects.linpro.no/wiki/FAQ/Compression
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
# If the browser supports it, we'll use gzip.
set req.http.Accept-Encoding = "gzip";
}
else if (req.http.Accept-Encoding ~ "deflate") {
# Next, try deflate if it is supported.
set req.http.Accept-Encoding = "deflate";
}
else {
# Unknown algorithm. Remove it and send unencoded.
unset req.http.Accept-Encoding;
}
}
return (hash);
}
sub vcl_deliver {
# If the response contains the X-Drupal-Roles header and the request URL
# is right. Copy the X-Drupal-Roles header over to the request and restart.
if (req.url == "/varnish/roles" && resp.http.X-Drupal-Roles) {
set req.http.X-Drupal-Roles = resp.http.X-Drupal-Roles;
set req.url = req.http.X-Original-URL;
unset req.http.X-Original-URL;
return (restart);
}
# If responces X-Drupal-Roles is not set, move it from the request.
if (!resp.http.X-Drupal-Roles) {
set resp.http.X-Drupal-Roles = req.http.X-Drupal-Roles;
}
# Remove server information
set resp.http.X-Powered-By = "Ding T!NG";
# Debug
if (obj.hits > 0 ) {
set resp.http.X-Varnish-Cache = "HIT";
}
else {
set resp.http.X-Varnish-Cache = "MISS";
}
}
# Code determining what to do when serving items from the Apache servers.
sub vcl_backend_response {
# Allow items to be stale if needed.
set beresp.grace = 6h;
# We need this to cache 404s, 301s, 500s. Otherwise, depending on backend but
# definitely in Drupal's case these responses are not cacheable by default.
if (beresp.status == 404 || beresp.status == 301 || beresp.status == 500) {
set beresp.ttl = 10m;
}
# Don't allow static files to set cookies.
# (?i) denotes case insensitive in PCRE (perl compatible regular expressions).
# This list of extensions appears twice, once here and again in vcl_recv so
# make sure you edit both and keep them equal.
if (bereq.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?[\w\d=\.\-]+)?$") {
unset beresp.http.set-cookie;
}
# If ding_varnish has marked the page as cachable simeply deliver is to make
# sure that it's cached.
if (beresp.http.X-Drupal-Varnish-Cache) {
return (deliver);
}
}
sub vcl_backend_error {
# Redirect to some other URL in the case of a homepage failure.
#if (beresp.url ~ "^/?$") {
# set beresp.status = 302;
# set beresp.http.Location = "http://backup.example.com/";
#}
# Otherwise redirect to the homepage, which will likely be in the cache.
set beresp.http.Content-Type = "text/html; charset=utf-8";
synthetic({"
<html>
<head>
<title>Page Unavailable</title>
<style>
body { background: #303030; text-align: center; color: white; }
#page { border: 1px solid #CCC; width: 500px; margin: 100px auto 0; padding: 30px; background: #323232; }
a, a:link, a:visited { color: #CCC; }
.error { color: #222; }
</style>
</head>
<body onload="setTimeout(function() { window.location = '/' }, 5000)">
<div id="page">
<h1 class="title">Page Unavailable</h1>
<p>The page you requested is temporarily unavailable.</p>
<p>We're redirecting you to the <a href="/">homepage</a> in 5 seconds.</p>
<div class="error">(Error "} + beresp.status + " " + beresp.response + {")</div>
</div>
</body>
</html>
"});
return (deliver);
}