在Nginx中对无WordPress/WooCommerce相关Cookie的PHP请求实现限流的配置咨询
嘿,我来帮你调整Nginx配置,实现只对没有WordPress/WooCommerce相关Cookie的PHP请求限流~
核心思路是自定义一个变量,用来判断当前请求是否携带了你指定的那些Cookie:如果完全没带,就把这个变量设为客户端IP,触发限流规则;反之则不触发。
下面是调整后的完整配置,我会标注关键修改点:
http { # 定义限流区域,这里改用我们后续的自定义变量$limit_key limit_req_zone $limit_key zone=mylimit:10m rate=50r/m; } server { ... # 第一步:在server块内定义变量,初始值为空(默认不限流) set $limit_key ""; # 第二步:检查请求Cookie是否不包含指定的WordPress/WooCommerce前缀 # !~* 表示不匹配且忽略大小写,覆盖各种可能的Cookie命名格式 if ($http_cookie !~* "(wp-|wordpress-|comment_|woocommerce_)") { # 如果符合条件(无目标Cookie),把变量设为客户端二进制IP,用于触发限流 set $limit_key $binary_remote_addr; } location ~ \.php$ { ... # 第三步:给PHP请求应用限流规则,只有$limit_key有值时才会生效 # nodelay 参数表示超过限制的请求直接返回503,不排队;不需要的话可以去掉 limit_req zone=mylimit nodelay; fastcgi_param SCRIPT_FILENAME /var/www/mysite.com$fastcgi_script_name; ... } }
再给你几个小提示:
- 正则里的括号是分组匹配,确保只要Cookie里有任意一个前缀的字段,就不会触发限流
- 你可以根据实际需求调整
rate=50r/m的数值,比如10r/s就是每秒允许10次请求 - 如果不想直接拒绝超限制请求,去掉
nodelay后,Nginx会把超出的请求放入队列排队处理,直到队列满了才返回503
备注:内容来源于stack exchange,提问作者László Monda
相关产品推荐
相关产品推荐

