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ê
相关产品推荐
相关产品推荐

