使用 Nginx limit_req_zone 模块仅对主页进行速率限制?

使用 Nginx limit_req_zone 模块仅对主页进行速率限制?

我安装了 Wordpress 多站点,并且有一些机器人在敲打主页。我想只对站点的主页设置速率限制,而对其他页面不设限制。

我的麻烦是制作一个与主页的“空白”地址 /index.php 相匹配的 NGINX 位置,我可以通过匹配“/”来限制整个站点,但这不是我需要的。

我尝试使用“索引”作为定义位置,但不起作用。我是不是错过了什么窍门?这是一个很难寻找的案例,因为大多数选择性限制问题都来自做相反事情的人,他们使用更具体的地址(例如登录脚本)来限制资源。

以下是我尝试过的:

limit_req_zone $binary_remote_addr zone=mainlimit:10m rate=1r/m;

server {

    # SSL configuration

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;
    server_name example.com www.example.com;
    client_max_body_size 120M;

    root /usr/share/nginx/example;
    index index.php index.html index.htm;

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    #subdomain multi site with wp in 'wp' subdir
    if (!-e $request_filename) {
    # Redirect wp-* files/folders
    rewrite ^(/[^/]+)?(/wp-.*) /wp/$2 last;

    # Redirect other php files
    rewrite ^(/[^/]+)?(/.*\.php) /wp/$2 last;
    }

    location index { #THIS DOES NOT MATCH THE HOME PAGE
        limit_req zone=mainlimit burst=3 nodelay;
        try_files $uri $uri/ /index.php?$args ;
    }

    location / {
        #limit_req zone=mainlimit burst=3 nodelay; THIS MATCHES EVERYTHING
        try_files $uri $uri/ /index.php?$args ;
    }
    location ~* /wp-content/uploads/.*\.php$ {
    return 503;
    }

    location ~* /data/.*\.php$ {
    return 503;
    }
 ***MORE STUFF...

答案1

使用精确匹配location

location = / {
    limit_req zone=mainlimit burst=3 nodelay;
    try_files $uri $uri/ /index.php?$args;
}

location / {
    try_files $uri $uri/ /index.php?$args;
}

相关内容