nginx - nginx如何限制ip访问
问题描述
我想通过 IP 限制 Nginx reverse_proxy 中特定 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;
}
}
但是当我启动服务器时,Nginx 会阻止mine.php
. 问题是什么?
解决方案
Nginx 选择单个location
块来处理请求(请参阅此文档)。您的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
语句可以移动到外部块中,以便它们被两个块继承。有关详细信息,请参阅此文档。
推荐阅读
- python - python中的有限差分方法
- python - 如何使用 sklearn 和 numpy 获得预测的标签?
- c++ - 这个返回元素位置的基于循环的函数有什么问题?
- c# - 无法使用服务帐户通过 SMTP mailkit 和 Gmail API 发送消息
- encryption - base64 解码的字符串给出了奇怪的字符
- php - PHP DateInterval 创建分秒(微秒或毫秒)间隔
- java - 无法从 POST 请求返回数据/响应
- makefile - 为什么Makefile不执行别名语句
- java - 在 exo1.Batiment 类中找不到主方法,请将主方法定义为:public static void main(String[] args) 或 JavaFX 应用程序类
- c - 如何使代码段在运行时可写