我们可以将正则表达式字符串放在环境变量中吗?

Can we put regex string in enviroment variable?

我在 rails 中有代码可以像这样从 env 中的域列表中检查 CORS

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

  if ENV["DOMAIN_CORS"].present? && !ENV["DOMAIN_CORS"].empty?
    domains = ENV["DOMAIN_CORS"].split(",").map { |origin| origin.strip }
  end

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

我有这样的环境 DOMAIN_CORS = "https://example1.com, https://example2.com"

上面的代码可以很好地检查这两个域的 cors,但是如果我想让 example.com 的所有子域都可以工作,请阅读此处的一些帖子

https://github.com/cyu/rack-cors/issues/30

我需要像这样进行正则表达式检查

(.*?)\.example\.com

我将环境设置为

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

但所有方法似乎都行不通,所以无论如何我可以在这种情况下将正则表达式字符串放入 env 中吗? .谢谢

如您所见,他们在链接的 rack-cors 问题中使用的是 Regexp class,而不是像您的情况那样的 String

我建议连接 2 个环境变量:

  • STRING_DOMAIN_CORS="https://example1.com, https://example2.com"
  • REGEXP_DOMAIN_CORS="(.*?).example.com"

并相应地映射它们:

ENV['STRING_DOMAIN_CORS'].split(",").map { |origin| origin.strip } +
ENV['REGEXP_DOMAIN_CORS'].split(",").map { |origin| origin.strip }.map { |origin| Regexp.new(origin) }

在您的环境变量字符串中,将正则表达式括在 // 之间,以便我们可以相应地检索和解析它:

DOMAINS_CORS = "https://example1.com, https://example2.com, /(.*?)\.example\.com/"
domains = DOMAIN_CORS.split(",").map(&:strip).map{ |x| x.start_with?("/") ? Regexp.new(x[1..-2]) : x }
 => ["https://example1.com", "https://example2.com", /(.*?)\.example\.com/]
 #=>  ^ string                ^ string                ^ regexp

上面的解析和 returns 字符串和正则表达式对象数组可以传递给 origins,如下所示

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