我有一个 MVC 应用程序,其中一个控制器只需要从多个 ips 访问(这个控制器是一个 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;
}
但是这种重写方式一直在发生,允许和拒绝指令被忽略。我不明白为什么...
它总是重写的原因是因为重写指令是在重写阶段评估的,该阶段在访问阶段之前评估允许和拒绝。它们在文件中的出现顺序无关紧要。您可以通过两种方式解决这个问题:要么不使用 rewrite in location /oauth 将请求发送到您的前端控制器,要么在重写阶段处理源 ip。你已经在你的工作配置中做了后者,但它可以更清楚一点:
或者: