You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤指向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里添加前置校验逻辑:
    # 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
    
    这样所有请求都会先经过这个校验,非法域名的请求直接返回403禁止访问,不会进入后续的业务逻辑。
方案二:通过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块,只指定你的合法域名:
    server {
      listen 80;
      listen [::]:80;
      server_name your-valid-domain.com www.your-valid-domain.com;
    
      # 下面是你的Rails代理配置,比如passenger或者proxy到puma
      # ...
    }
    
    配置完后重启Nginx: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:00