通过 Puma 从 Sinatra 传递 headers(或其他设置)
Passing headers (or other settings) from Sinatra through Puma
我正在尝试学习如何使用纯 Ruby 开发简单的 Web 应用程序。我有一个简单的后端服务,我将其创建为 Sinatra 应用程序。在开发它时,我注意到由于 CORS 策略,前端(一个简单的 HTML/JS 静态站点)不会与其通信。所以我研究了如何从 Sinatra 传递 headers。
我遇到了 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
基本上,将应用程序包装在 class 中,然后从 config.ru
中调用它。当我在运行这个目录下运行宁puma
的时候,服务上来了,但是headers都不再回传了。每当我尝试访问后端时,我都会得到:
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.
这是我在最初设置 headers 之前遇到的错误。所以我很清楚 set
参数被忽略了。
所以,这似乎是一件简单的事情,但我一直无法找到合适的答案:如何让 Puma 尊重 'set' 参数?或者,如何实现相同的预期结果?
我似乎很清楚我错过了一个非常简单的东西,但我无法弄清楚它到底是什么。
提前致谢!
您的 class 中似乎缺少 register Sinatra::Cors
。
class WebApp < Sinatra::Application
register Sinatra::Cors # Add this line.
set :allow_origin, '*'
# etc.
我正在尝试学习如何使用纯 Ruby 开发简单的 Web 应用程序。我有一个简单的后端服务,我将其创建为 Sinatra 应用程序。在开发它时,我注意到由于 CORS 策略,前端(一个简单的 HTML/JS 静态站点)不会与其通信。所以我研究了如何从 Sinatra 传递 headers。
我遇到了 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
基本上,将应用程序包装在 class 中,然后从 config.ru
中调用它。当我在运行这个目录下运行宁puma
的时候,服务上来了,但是headers都不再回传了。每当我尝试访问后端时,我都会得到:
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.
这是我在最初设置 headers 之前遇到的错误。所以我很清楚 set
参数被忽略了。
所以,这似乎是一件简单的事情,但我一直无法找到合适的答案:如何让 Puma 尊重 'set' 参数?或者,如何实现相同的预期结果?
我似乎很清楚我错过了一个非常简单的东西,但我无法弄清楚它到底是什么。
提前致谢!
您的 class 中似乎缺少 register Sinatra::Cors
。
class WebApp < Sinatra::Application
register Sinatra::Cors # Add this line.
set :allow_origin, '*'
# etc.