nginx 屏蔽访问目标
如果你希望 禁止某些路由地址,例如日志中出现的 /news/xxxxxxx
或类似的无效路由,可以通过在 Nginx 配置中设置规则来阻止这些请求。以下是几个常见的解决方案。
1. 通过 Nginx 配置文件屏蔽特定路径
可以通过 location
配置指令来匹配并禁止访问特定的 URL 路径。根据你提供的日志,假设你希望阻止访问 /news/
路径中的特定内容,可以使用以下方法:
示例 1:禁止访问 /news/
路径下的所有内容
server {
listen 80;
server_name your-domain.com;
# 禁止访问所有 /news/ 路径的页面
location ~ ^/news/ {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
示例 2:禁止访问 /news/
路径下的特定页面
如果你只想阻止特定的 URL 路径(例如 /news/20170531/4029071
),可以使用正则表达式:
server {
listen 80;
server_name your-domain.com;
# 禁止访问特定的 /news 路径
location ~ ^/news/20170531/4029071$ {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
2. 通过 Nginx 配置文件阻止某些请求方法
根据你的日志,有些请求是 HEAD
请求。你可以选择禁止这些请求方法(例如 HEAD
),阻止访问某些类型的请求。
server {
listen 80;
server_name your-domain.com;
# 禁止所有 HEAD 请求
if ($request_method = "HEAD") {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
3. 通过 User-Agent 屏蔽爬虫
在日志中,访问来自于一些爬虫(如 bingbot
)。你可以屏蔽特定的 User-Agent(例如 bingbot
)。
server {
listen 80;
server_name your-domain.com;
# 屏蔽特定的 User-Agent (如 bingbot)
if ($http_user_agent ~* "bingbot") {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
4. 根据 Referer 屏蔽请求
你也可以根据 Referer
请求头来阻止来自特定来源的请求。假设某些请求来自非法或不需要的来源,可以通过 Referer
来过滤。
server {
listen 80;
server_name your-domain.com;
# 屏蔽某些 Referer 来源
if ($http_referer ~* "example.com") {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
5. 限流防止恶意请求
你还可以使用 Nginx 限制某个 IP 或路径的访问频率,减少恶意请求。
http {
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s;
server {
listen 80;
server_name your-domain.com;
# 限制特定 IP 的访问频率
limit_req zone=req_limit_per_ip burst=5 nodelay;
# 其他配置...
}
}
如果你只需要屏蔽掉 /news/
路径下超过 3 层的 URL(比如 /news/4058483/4058476/4058413
),可以通过 Nginx 配置中的正则表达式来匹配并屏蔽这样的请求。
配置方法:
你可以使用 Nginx 的 location
配置,通过正则表达式匹配 /news/
路径下超过 3 层的 URL。
示例配置:
server {
listen 80;
server_name your-domain.com;
# 屏蔽 /news/ 路径下超过 3 层的 URL
location ~ ^/news/[^/]+/[^/]+/[^/]+/ {
return 403; # 返回 HTTP 403 禁止访问
}
# 其他配置...
}
解释:
location ~ ^/news/[^/]+/[^/]+/[^/]+/
:^/news/
:表示匹配所有以/news/
开头的路径。[^/]+
:表示匹配一个由非斜杠 (/
) 组成的部分(即一段路径)。[^/]
表示匹配任何不是/
的字符,+
表示匹配一个或多个这样的字符。/[^/]+/[^/]+/
:此正则表达式匹配路径中连续的三段(即/news/xxx/xxx/xxx/
,其中xxx
是任意不包含斜杠的字符)。- 如果 URL 的层级超过三层(例如
/news/4058483/4058476/4058413
),该正则表达式将匹配并阻止访问。
结果:
此配置会 阻止 所有路径为 /news/
后面跟 超过 3 层路径 的 URL 请求,并返回 HTTP 403(禁止访问)。
在 Nginx 中,限制指定 IP 或 IP 段的访问可以通过
allow
和deny
指令来实现。你可以指定允许或拒绝访问的 IP 地址或 IP 范围。
1. 限制单个 IP 地址
要限制某个特定的 IP 地址(比如 192.168.1.100
)访问,可以使用 deny
指令:
server {
listen 80;
server_name your-domain.com;
# 限制特定 IP 地址的访问
deny 192.168.1.100; # 拒绝此 IP 的访问
allow all; # 允许其他 IP 访问
# 其他配置...
}
2. 限制 IP 段(子网)
你也可以限制一个 IP 段的访问(例如,限制 192.168.1.0/24
段的访问)。使用类似以下的方式:
server {
listen 80;
server_name your-domain.com;
# 限制整个 IP 段(如 192.168.1.0/24)
deny 192.168.1.0/24; # 拒绝这个 IP 段的访问
allow all; # 允许其他 IP 访问
# 其他配置...
}
3. 允许特定 IP 或 IP 段,拒绝其他所有 IP
如果你只希望某些特定 IP 或 IP 段能够访问,而其他的 IP 都被拒绝,可以反过来配置,先允许特定的 IP 地址,然后拒绝所有其他的请求:
server {
listen 80;
server_name your-domain.com;
# 允许特定 IP 地址访问
allow 192.168.1.100; # 允许 192.168.1.100 访问
allow 192.168.1.0/24; # 允许 192.168.1.x 段的 IP 访问
# 拒绝其他所有 IP 地址的访问
deny all; # 拒绝所有其他 IP 地址的访问
# 其他配置...
}
4. 多个 IP 或 IP 段
你可以配置多个 allow
和 deny
指令来允许或拒绝不同的 IP 或 IP 段。例如,允许来自 192.168.1.0/24
和 192.168.2.100
的访问,拒绝其他所有 IP:
server {
listen 80;
server_name your-domain.com;
# 允许多个 IP 或 IP 段访问
allow 192.168.1.0/24; # 允许整个子网
allow 192.168.2.100; # 允许单个 IP
# 拒绝其他 IP 的访问
deny all; # 拒绝其他所有 IP
# 其他配置...
}
总结:
- 使用
allow
来允许特定的 IP 或 IP 段。 - 使用
deny
来拒绝特定的 IP 或 IP 段。 - 通过配置顺序,
allow
优先于deny
,所以要根据需要灵活配置。