【发布时间】:2020-07-30 23:44:29
【问题描述】:
我正在尝试学习如何使用纯 Ruby 开发一个简单的网络应用程序。我有一个作为 Sinatra 应用程序创建的简单后端服务。在开发它时,我注意到前端(一个简单的 HTML/JS 静态站点)由于 CORS 策略而无法与其通信。所以我研究了如何从 Sinatra 传递标头。
我遇到了sinatra-cors。我按照说明进行了设置,我的应用看起来像这样(缩写):
require 'sinatra'
require 'sinatra/cors'
set :allow_origin, '*'
set :allow_methods, 'GET,HEAD,POST'
set :allow_headers, 'content-type,if-modified-since,access-control-allow-methods,access-control-allow-origin'
set :expose_headers, 'content-disposition'
set :allow_credentials, true
post '/' do
[...]
end
当我使用ruby app.rb 运行它时,它运行良好。前端可以通信并遵守 CORS 政策。
现在,我想为生产环境设置服务。为此,我想使用 Puma。所以对于 Puma,我有一个 config.ru,它看起来像这样:
require File.expand_path('app', File.dirname(__FILE__))
run WebApp
我修改了我的app.rb 看起来像这样(再次缩写):
require 'sinatra'
require 'sinatra/cors'
class WebApp < Sinatra::Application
set :allow_origin, '*'
set :allow_methods, 'GET,HEAD,POST'
set :allow_headers, 'content-type,if-modified-since,access-control-allow-methods,access-control-allow-origin'
set :expose_headers, 'content-disposition'
set :allow_credentials, true
post '/' do
[...]
end
end
基本上,将应用程序包装在一个类中,并从config.ru 调用它。当我通过在目录中运行 puma 来运行它时,服务会出现,但标头不再被传回。每当我尝试访问后端时,我都会得到:
Access to XMLHttpRequest at 'http://localhost:4567/' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这是我最初设置标题之前遇到的错误。所以我很清楚set 参数被忽略了。
所以,这似乎是一件简单的事情,但我一直无法找到正确的答案:如何让 Puma 尊重“设置”参数?或者,我如何获得相同的预期结果?
我似乎很清楚我错过了一件非常简单的事情,但我无法弄清楚它到底是什么。
提前致谢!
【问题讨论】:
标签: ruby cors rack puma response-headers