我正在尝试学习如何使用纯Ruby开发简单的Web应用。我有一个作为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尊重'set'参数?或者,如何达到相同的期望结果?
在我看来,我似乎很想念一件非常简单的事情,但我无法弄清楚到底是什么。
提前感谢!
似乎您只是在课程中缺少register Sinatra::Cors
。
class WebApp < Sinatra::Application
register Sinatra::Cors # Add this line.
set :allow_origin, '*'
# etc.