使用 Nginx 限制对 MVC 应用程序的一个控制器的访问

使用 Nginx 限制对 MVC 应用程序的一个控制器的访问

我有一个 MVC 应用程序,其中一个控制器仅需要从多个 ip 访问(此控制器是一个 oauth 令牌回调陷阱 - 用于 google/fb api 令牌)。我的配置文件如下所示:

geo $oauth {
    default 0;
    87.240.156.0/24 1;
    87.240.131.0/24 1;
}

server {
    listen 80;
    server_name some.server.name.tld default_server;
    root /home/user/path;
    index index.php;

    location /oauth {
        deny all;
        if ($oauth) {
            rewrite ^(.*)$ /index.php last;
        }
    }

    location / { 
        if ($request_filename !~ "\.(phtml|html|htm|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|xlsx)$") {
            rewrite ^(.*)$ /index.php last;
            break;
        }
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

它可以工作,但是看起来不正确。

我认为以下内容合乎逻辑:

    location /oauth {
        allow 87.240.156.0/24;
        deny all;
        rewrite ^(.*)$ /index.php last;
    }

但这种方式总是会发生重写,允许和拒绝指令会被忽略。我不明白为什么……

答案1

它总是重写的原因是重写指令是在重写阶段评估的,该阶段在访问阶段之前,其中评估允许和拒绝。它们在文件中的出现顺序无关紧要。您可以通过两种方式解决这个问题:要么不要在 location /oauth 使用重写将请求发送到您的前端控制器,要么在重写阶段处理源 ip。您已经在工作配置中执行了后者,但可以做得更清楚一些:

geo $oauth_denied {
    default 1;
    87.240.156.0/24 0;
    87.240.131.0/24 0;
}

server {
    ...

    location /oauth {
        if ($oauth_denied) { return 403; }
        rewrite ^ /index.php last;
    }

    ...
}

或者:

server {
    ...

    # include at server level so they're inherited by locations
    include fastcgi_params;

    location /oauth {
        allow 87.240.156.0/24;
        deny all;

        # try_files will change $uri so all the params work
        try_files /index.php =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    ...
}

相关内容