如何在nginx中限制ip访问

如何在nginx中限制ip访问,nginx,reverse-proxy,Nginx,Reverse Proxy,我想限制IP对Nginx reverse_代理中特定php文件的访问。 因此,在我的虚拟主机路径/etc/nginx/sites available/sub.mydmn.com中,我有以下配置: server { server_name wwww.sub.mydmn.com sub.mydmn.com; root /home/mydmn/; access_log off; # Static contents location ~* ^.+.(png|m

我想限制IP对Nginx reverse_代理中特定php文件的访问。 因此,在我的虚拟主机路径
/etc/nginx/sites available/sub.mydmn.com
中,我有以下配置:

server {
    server_name wwww.sub.mydmn.com sub.mydmn.com;
    root /home/mydmn/;

    access_log off;

    # Static contents
    location ~* ^.+.(png|mp4|jpeg)$ {
        expires max;
    }

    # Limit IP access
    location = /mine.php {
        allow <MyIP_Here>;
        deny all;
        return 404;
    }

    # Dynamic content, forward to Apache
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}

# Deny server with IP access!
server {
    listen 80 default_server;
    server_name _;
    location / {
    return 403;
    }
}
服务器{
服务器名称www.sub.mydmn.com sub.mydmn.com;
root/home/mydmn/;
访问/注销;
#静态内容
位置~*^.+(png | mp4 | jpeg)${
最大值;
}
#限制IP访问
location=/mine.php{
允许;
否认一切;
返回404;
}
#动态内容,转发到Apache
地点/{
代理集头X-Real-IP$remote\u addr;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://127.0.0.1:8080;
}
}
#拒绝具有IP访问权限的服务器!
服务器{
监听80个默认_服务器;
服务器名称;
地点/{
返回403;
}
}
但是当我启动服务器时,Nginx会阻止
mine.php
的所有IP。
问题出在哪里?

Nginx选择单个
位置
块来处理请求(请参阅)。如果IP地址被拒绝,则您的
location=/mine.php
块不仅返回403状态,如果IP地址被允许,还返回404状态。如果允许IP地址,则需要端口8080上的服务处理该请求

一种解决方案是从
location/
块复制语句

例如:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;

location = /mine.php {
    allow ...;
    deny all;
    proxy_pass http://127.0.0.1:8080;
}
location / {
    proxy_pass http://127.0.0.1:8080;
}

请注意,
proxy\u set\u header
语句可以移动到外部块中,以便两个块都继承它们。有关详细信息,请参阅。

这是否回答了您的问题@RogertheShrubber我不需要白名单,我想允许访问
mine.php
仅使用反向代理中的1个IP地址,您应该用另一个
位置
块中的4个
代理
语句替换
return 404
。@Richard Smith非常感谢。你能给我一个更清晰的完整答案吗?太好了!!,太好了