如何禁止通过IP访问Nginx站点,仅允许域名访问?
如何禁止通过IP访问Nginx站点,仅允许域名访问?
嘿,我来帮你搞定这个问题!你已经把HTTP(80端口)的情况处理好了,但漏掉了HTTPS(443端口)的配置——这就是为什么用IP访问HTTPS还能跳转到你的Flask实例的原因。
咱们一步步来完善配置:
第一步:给HTTPS端口添加默认拒绝规则
你需要给443端口也设置一个默认的server块,和80端口的逻辑一致,直接返回444(Nginx专属的关闭连接状态码,比403更彻底)。不过要注意,HTTPS要求必须配置证书,哪怕是通过IP访问的情况,你可以用一个自签证书(如果没有的话,自己生成一个就行),配置如下:server { listen 443 ssl default_server; # 替换成你的证书路径,自签证书完全够用 ssl_certificate /etc/nginx/ssl/self-signed.crt; ssl_certificate_key /etc/nginx/ssl/self-signed.key; return 444; }第二步:确保你的域名server块配置正确
你的正常业务server块必须明确指定server_name为你的域名,这样只有访问该域名的请求才会被转发到Flask。示例配置如下:server { listen 80; listen 443 ssl; # 替换成你的实际域名,多个域名用空格分隔 server_name yourdomain.com www.yourdomain.com; # 反向代理到Flask的配置,根据你的实际情况调整 location / { proxy_pass http://localhost:5000; # 假设Flask运行在本地5000端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 这里配置你域名的合法SSL证书 ssl_certificate /etc/nginx/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; }第三步:检查其他server块
如果你还有其他server块,一定要给它们都加上明确的server_name,避免和默认server块产生匹配冲突。
配置完成后,重启Nginx(sudo systemctl restart nginx),这样无论是通过IP访问HTTP还是HTTPS,都会被直接拒绝,只有通过指定域名的请求才能正常访问你的Flask服务啦!
备注:内容来源于stack exchange,提问作者Justin Battaglia




