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

Rails中能否将正则表达式存入环境变量实现Rack::Cors子域名跨域匹配?

解决方案

你当前的写法不生效的核心原因是:环境变量读取到的所有内容默认都是字符串类型,Rack::Cors的origins方法只有接收到正则对象时才会做正则匹配,传入正则格式的字符串只会被当做普通域名做精确匹配,自然不会生效。

修改方案

首先改造你配置CORS的代码,增加字符串转正则的处理逻辑:

config.middleware.insert_before 0, Rack::Cors do
  domains = []

  if ENV["DOMAIN_CORS"].present?
    domains = ENV["DOMAIN_CORS"].split(",").map do |origin|
      origin_str = origin.strip
      # 约定以/开头和结尾的内容识别为正则表达式
      if origin_str.start_with?('/') && origin_str.end_with?('/')
        Regexp.new(origin_str[1..-2])
      else
        origin_str
      end
    end
  end

  allow do
    origins domains
    resource "*", headers: :any, methods: [:get, :post, :put, :delete, :options], credentials: true
  end
end

环境变量配置规则

  • 普通固定域名直接写完整地址即可
  • 正则匹配的域名用/包裹正则内容,注意正则内的特殊字符需要转义,如果你使用.env文件管理环境变量,反斜杠需要写两次才能正确识别

正确的配置示例:

DOMAIN_CORS = "https://example1.com, https://example2.com, /(.*)\.example\.com$/"

注意正则末尾加$可以避免被恶意域名如xxx.example.com.evil.com匹配命中,提升安全性。

内容的提问来源于stack exchange,提问作者Thanh Long Lê

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:15:00