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

问题描述 投票:0回答:3

我在 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 中? 。谢啦

ruby-on-rails regex ruby environment-variables ruby-on-rails-5
3个回答
3
投票

enter image description here

正如您所看到的,他们在链接的rack-cors问题中使用的是

Regexp
类,而不是您的情况中的
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) }

enter image description here


3
投票

在您的环境变量字符串中,将正则表达式括在

//
之间,以便我们可以相应地检索和解析它:

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

0
投票

要将字符串转换为 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 变量时周围不要有退格符

© www.soinside.com 2019 - 2024. All rights reserved.