Nginx阻止特定请求,避免裸域名触发www重定向
解决Nginx裸域名恶意请求先301重定向再返回404的问题
问题根源
你的裸域名(example.com)server块中,重定向到www的规则优先级高于恶意请求拦截规则——因为你把return 301放在了拦截规则前面,Nginx执行到重定向就直接终止请求处理,根本不会触发后面的拦截逻辑,导致恶意请求先被跳转到www,再返回404。
解决方案
调整裸域名server块的规则顺序,将恶意请求拦截规则放在重定向规则之前,确保匹配到恶意路径的请求直接返回404,不触发重定向。
1. 修改裸域名的HTTP/HTTPS server块
以HTTP为例,修改后的配置如下:
server { listen 80; server_name example.com; # 优先拦截恶意请求:直接返回404,不执行后续重定向 location ~* \.php$ { return 404; } location ~* /(wp-content|wp-includes) { return 404; } # 仅正常请求才重定向到www子域名 return 301 $scheme://www.example.com$request_uri; }
如果你的网站启用了HTTPS,需要在443端口的裸域名server块中做同样的配置:
server { listen 443 ssl; server_name example.com; # 此处保留你的SSL证书配置 ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # 同样优先拦截恶意请求 location ~* \.php$ { return 404; } location ~* /(wp-content|wp-includes) { return 404; } # 正常请求重定向到www return 301 $scheme://www.example.com$request_uri; }
2. (可选)统一维护拦截规则
如果多个server块都需要相同的拦截规则,可以把拦截逻辑单独存为一个配置片段,方便统一维护:
- 创建文件
/etc/nginx/conf.d/block-malicious.conf,内容如下:
location ~* \.php$ { return 404; } location ~* /(wp-content|wp-includes) { return 404; }
- 在裸域名server块中,将
include /etc/nginx/conf.d/block-malicious.conf;放在重定向规则之前;在www子域名的server块中,直接include该文件即可。
验证配置
修改完成后,先检查Nginx配置是否合法:
nginx -t
如果提示test is successful,再重新加载配置:
systemctl reload nginx
这样,裸域名下的恶意请求会直接返回404,不会触发301重定向,解决监控告警问题。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

