php - Varnish/NGINX 基于时间的限制

标签 php mysql apache nginx varnish

我正在尝试为我们的 CMS 实现基于时间和地理位置的限制。以下是当前设置的样子

  • Nginx(端口:443):用于 SSL 终止和 URL 操作
  • Varnish(端口:80):缓存来自后端的动态内容
  • Apache、PHP、MySQL自定义 CMS 在此堆栈上运行

要求是在特定时间段内,来自特定国家/地区的流量不能访问特定的 URL/类别,但来自世界其他地区的流量可以不受限制地访问相同的 URL/类别。

地理位置部分似乎并不令人生畏,但我还没有找到任何关于根据时间限制流量的信息。

当然,我可以设置两个 varnish 或 nginx 配置,一个有限制,一个没有限制,让一个 cron 作业根据我想要完成的时间替换物理文件,但我希望有一个更干净的解决方案。

我知道所有这些都可以用 PHP 处理,但我不能从堆栈中删除 Varnish,我必须放入 5-6 个服务器来处理负载,这会增加我无法证明的成本。

帮忙吗?

最佳答案

您可以在 varnish 中使用 now,然后在 varnish 中对日期执行正则表达式以生成 403 或其他内容

这里有一个示例 varnishtest 案例,展示了如何使用 now

varnishtest "Time Gate"

server s1 {
       rxreq
       txresp

} -start

varnish v1 -vcl+backend {
    import std;

    sub vcl_recv {
        //now is in RFC format: Thu, 26 Apr 2018 08:40:22 GMT
        //set it in a "ghost header" to convert it to a STRING otherwise it is a TIME
        // and regex won't work
        set req.http.now_string = now;

        //Check the hour
        if(req.http.now_string ~ "^.* [0-9]{4} 08") {
              // Do stuff when its 08:xx
        } else {
             // Otherwise do something else.
        }


    }

    sub vcl_deliver {
        set resp.http.x-forwarded-for = client.ip;
        set resp.http.now_string = req.http.now_string;
    }
} -start

client c1 {
    txreq  -url "/1"
    rxresp
    expect resp.http.now_string ~  "2018"


} -run

关于地理保护,您也可以使用 https://github.com/varnish/libvmod-geoip 在 Varnish 中执行此操作这个 vmod。 (还没有亲自测试过)

关于php - Varnish/NGINX 基于时间的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50021315/

相关文章:

mysql 空值情况当为 null 时不起作用

php - 将音频文件从我的家用电脑流式传输到我的网站

php - 如何将事件目录链接到网页?

php - 打印带有 php 行错误的 href

php - call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数量与准备好的语句中的参数数量不匹配

用于本地开发的 Apache 单一动态虚拟主机配置

apache - 如何配置 apache tomcat 指向我的项目?

php - 如何从订单中获取 CustomerName?

php - 在 MySQL 表中插入带有 ' 的名称

php - 用于获取未提交特定一周时间的用户数据的 SQL 查询?