我想通过IP对Nginx reverse_proxy中的特定php文件进行IP访问限制。因此在我的虚拟主机路径/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;
}
}
但是当我启动服务器时,Nginx阻止了mine.php
的所有IP。有什么问题吗?
Nginx选择单个location
块来处理请求(请参阅this document)。您的location = /mine.php
块不仅在IP地址被拒绝的情况下返回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_set_header
语句可以移到外部块中,以便两个块都可以继承它们。有关详细信息,请参见this document。