我在Apache中有这样的东西
RewriteCond %{REMOTE_HOST} !^11\.22\.33\.[12]\d\d$ #As example allows from 100 till 200
RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1$
RewriteCond %{TIME} <20140113090000
RewriteRule ^/access-on-monday/ http://www.mysite.com/ [NC,L,R=302]
完美无缺。
我需要Varnish。 因为LoadBalancer后面的服务器它获得了具有真实客户端IP的X-Forwarded-For标头。因为安装了rpaf_module,我仍然检查Apache中的%{REMOTE_HOST}。 我在Varnish中添加了下一个帮助ipcast vmod
import ipcast;
acl office {
"localhost";
"11.22.33.100"/24; //Let's think that it matches with 11.22.33.100 - 11.22.33.200
}
sub vcl_recv {
if (req.http.X-Forwarded-For !~ ",") {
set req.http.xff = req.http.X-Forwarded-For;
} else {
set req.http.xff = regsub(req.http.X-Forwarded-For, "^[^,]+.?.?(.*)$", "\1");
}
if (ipcast.clientip(req.http.xff) != 0) {
error 400 "Bad request";
}
if (!client.ip ~ office) {
set req.http.X-Redir-Url = "http://" + req.http.Host + "/";
error 751 "Found";
}
}
然后在vcl_error中我进行了重定向,但这并不重要。 我的问题是可以像Apache一样进行基于时间的访问吗?
答案 0 :(得分:1)
你受限于简单的VCL,但Varnish允许做的不仅仅是简单的陈述。 您可以使用inline-C或VMOD增强和驱动您的主力,并在C中完成这项工作。
例如,如果您想从以下位置添加基于时间的访问权限:
backend server_available_in_2014 {
.host="127.0.0.1";
.port="8080";
}
sub vcl_recv {
set req.backend = server_available_in_2014; # IT MUST BE AVAILABLE ONLY in 2014
}
您可以将日期201401010000
转换为UNIX时间戳1389617122
,并编写简单的内联-C:
backend server_available_in_2014 {
.host="127.0.0.1";
.port="8080";
}
C{
double TIM_real(void);
}C
sub vcl_recv {
C{
if (TIM_real() > 1389617122.0) {
VRT_l_req_backend(sp, VGCDIR(_server_available_in_2014));
}
}C
}
TIM_real()
返回当前时间戳(查看 varnish / lib / libvarnish / time.c ),VRT_l_req_backend
语句与set req.backend = server_available_in_2014;
完全相同,但用C语言代替VCL。
如果您想要更多调整,可以通过执行以下命令将VCL编译为C:varnishd -f default.vcl -C