如何过滤指向Rails网站的未知域名?(环境:Rails5.1.4、Ruby2.4.2)
嘿,我来帮你解决这个未知域名指向的问题!针对你的Rails 5.1.4 + Ruby 2.4.2环境,我整理了几个实用的方案,从应用层到基础设施层都有,你可以根据自己的需求选择:
方案一:在Rails应用内直接拦截
这是最直接的应用层解决方案,不用动服务器配置,适合快速生效:
- 第一步,先在Rails配置里定义允许访问的域名列表。打开
config/application.rb,添加一行配置:
把里面的域名换成你自己的合法域名就行,多个的话继续往后加。# config/application.rb config.allowed_hosts = ['your-valid-domain.com', 'www.your-valid-domain.com'] - 第二步,在全局的
ApplicationController里添加前置校验逻辑:
这样所有请求都会先经过这个校验,非法域名的请求直接返回403禁止访问,不会进入后续的业务逻辑。# app/controllers/application_controller.rb before_action :validate_request_host private def validate_request_host # 检查当前请求的host是否在允许列表里,不在就返回403 unless Rails.configuration.allowed_hosts.include?(request.host) render plain: 'Forbidden', status: :forbidden end end
方案二:通过Web服务器拦截(以Nginx为例)
如果你的网站用Nginx做反向代理(大部分Rails部署都会这么做),在这一层拦截会更高效——请求根本不会走到Rails进程,能节省服务器资源:
- 打开你的Nginx站点配置文件(通常路径是
/etc/nginx/sites-available/your-site.conf) - 先定义一个默认server块,用来拦截所有不匹配合法域名的请求:
# 拦截所有未知域名的HTTP请求 server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 这个特殊值匹配所有未被其他server块匹配的域名 return 403; # 直接返回403禁止访问 } # 拦截所有未知域名的HTTPS请求(如果启用了HTTPS) server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_certificate /path/to/your/cert.pem; # 可以用自签证书,浏览器会警告,但不影响拦截 ssl_certificate_key /path/to/your/key.pem; return 403; } - 然后保留你原来的合法站点server块,只指定你的合法域名:
配置完后重启Nginx:server { listen 80; listen [::]:80; server_name your-valid-domain.com www.your-valid-domain.com; # 下面是你的Rails代理配置,比如passenger或者proxy到puma # ... }sudo systemctl restart nginx,这样非法域名的请求就会被直接拦截。
方案三:VPS防火墙辅助拦截(可选)
如果想从网络层面再加一层防护,可以用防火墙限制Web端口的访问,但这个需要配合前面的方案一起用,因为防火墙没法直接识别域名(只能识别IP)。比如用ufw的话:
- 先允许必要的访问(比如你的办公IP、常用CDN节点IP等):
sudo ufw allow from 1.2.3.4 to any port 80,443 - 然后保持Web端口的默认开放,把域名过滤的核心逻辑交给Web服务器或者Rails,这样既不会误拦截正常用户,又能多一层防护。
测试方法
配置完后可以用curl模拟非法域名的请求,验证是否生效:
curl -H "Host: bad-domain.com" http://your-vps-ip
如果返回403,说明配置成功了。
内容的提问来源于stack exchange,提问作者Léo Coletta
相关产品推荐
相关产品推荐

