我在 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
类,而不是您的情况中的 String
。
我建议连接 2 个环境变量:
并相应地映射它们:
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
上面解析并返回字符串和正则表达式对象的数组,这些对象可以传递给
origins
,如下所示
allow do
origins domains
resource "*", headers: :any, methods: [:get, :post, :put, :delete, :options], credentials: true
end
要将字符串转换为 Ruby 中的正则表达式,可以使用 Regexp 类。 所以
Regexp.new(ENV.fetch('DOMAIN_CORS'))
应该完成这项工作。
irb(main):003:0> domains = '(.*?)\.example\.com'
=> "(.*?)\\.example\\.com"
irb(main):004:0> Regexp.new(domains)
=> /(.*?)\.example\.com/
irb(main):005:0>
记住设置 ENV 变量时周围不要有退格符