Rails 5.1 CORS - 如何为不同的环境设置不同的来源
Rails 5.1 CORS - how to set different origins for different environments
我正在使用 rack-cors gem 和 Rail 5.1 API。
根据文档,我有以下初始化程序:
config/initializers/cors.rb
module Api
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ['http://localhost:4200','https://app.mydomain.com/']
resource '*',
headers: :any,
:expose => ['access-token', 'expiry', 'token-type', 'uid', 'client'],
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
end
然而,这意味着当部署到生产环境时,我的 api 将接受来自任何 localhost:4200
来源的请求。
如何将这些设置分开,以便不同的环境可以有不同的允许来源?
有几种不同的选择。一种是使用 secrets.yml
文件。在那里你可以为每个环境定义不同的值,比方说:
development:
allowed_origins:
- http://localhost:4200
production:
allowed_origins:
- http://productionurl1.com
- http://productionurl2.com
然后在你的配置文件中你可以做
module Api
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins Rails.application.secrets.allowed_origins
end
end
end
另一个选项(取自评论)是使用环境文件,例如:
development.rb
config.allowed_cors_origins = ["http://localhost:4200"]
然后在 cors.rb
初始化器中你可以做:
Rails.application.config.allowed_cors_origins
(因为初始化程序将在环境配置文件之后调用,所以这应该有效)。
对于使用 rails 5.2 的任何人,secrets.yml
已更改,现在我们需要使用凭据。为了使用它,我们需要编辑 config/credentials.yml.enc
首先,运行 命令 EDITOR="atom --wait" rails credentials:edit
(使用您选择的编辑器)。然后,按照 的建议添加原点:
development:
allowed_origins:
- http://localhost:4200
production:
allowed_origins:
- http://productionurl1.com
- http://productionurl2.com
保存文件。现在允许的起源变量将在加密文件中。然后在 cors 初始值设定项中(在我的例子中是 application.rb)
config.middleware.insert_before 0, Rack::Cors do
allow do
origins Rails.application.credentials[Rails.env.to_sym][:allowed_origins]
resource '*',
headers: :any,
expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],
methods: [:get, :post, :options, :delete, :put]
end
end
我正在使用 rack-cors gem 和 Rail 5.1 API。
根据文档,我有以下初始化程序:
config/initializers/cors.rb
module Api
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ['http://localhost:4200','https://app.mydomain.com/']
resource '*',
headers: :any,
:expose => ['access-token', 'expiry', 'token-type', 'uid', 'client'],
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
end
然而,这意味着当部署到生产环境时,我的 api 将接受来自任何 localhost:4200
来源的请求。
如何将这些设置分开,以便不同的环境可以有不同的允许来源?
有几种不同的选择。一种是使用 secrets.yml
文件。在那里你可以为每个环境定义不同的值,比方说:
development:
allowed_origins:
- http://localhost:4200
production:
allowed_origins:
- http://productionurl1.com
- http://productionurl2.com
然后在你的配置文件中你可以做
module Api
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins Rails.application.secrets.allowed_origins
end
end
end
另一个选项(取自评论)是使用环境文件,例如:
development.rb
config.allowed_cors_origins = ["http://localhost:4200"]
然后在 cors.rb
初始化器中你可以做:
Rails.application.config.allowed_cors_origins
(因为初始化程序将在环境配置文件之后调用,所以这应该有效)。
对于使用 rails 5.2 的任何人,secrets.yml
已更改,现在我们需要使用凭据。为了使用它,我们需要编辑 config/credentials.yml.enc
首先,运行 命令 EDITOR="atom --wait" rails credentials:edit
(使用您选择的编辑器)。然后,按照
development:
allowed_origins:
- http://localhost:4200
production:
allowed_origins:
- http://productionurl1.com
- http://productionurl2.com
保存文件。现在允许的起源变量将在加密文件中。然后在 cors 初始值设定项中(在我的例子中是 application.rb)
config.middleware.insert_before 0, Rack::Cors do
allow do
origins Rails.application.credentials[Rails.env.to_sym][:allowed_origins]
resource '*',
headers: :any,
expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],
methods: [:get, :post, :options, :delete, :put]
end
end