不允许请求来源:使用 Rails5 和 ActionCable 时为 http://localhost:3001

Request origin not allowed: http://localhost:3001 when using Rails5 and ActionCable

在 Rails 5.0.0.beta2 中尝试使用 ActionCable 的应用程序出现服务器问题。

使用 localhost:3000 效果很好,因为这是大多数 ActionCable 的默认设置。但是如果我尝试 运行 端口 3001 上的 rails 服务器,它会给我 Request origin not allowed: http://localhost:3001

ActionCable 文档提到使用类似 ActionCable.server.config.allowed_request_origins = ['http://localhost:3001'] 的东西,如果我把它放在 config.ru

中,它对我有用

但这似乎是一个非常奇怪的地方。我觉得它应该能够进入初始化文件,或者我的 development.rb 环境配置文件。

为了进一步证明我的观点 应该 被允许进入那里,设置 ActionCable.server.config.disable_request_forgery_protection = true 可以忽略请求来源,即使我将它包含在 development.rb.

为什么 ActionCable.server.config.disable_request_forgery_protection 在 development.rb 中工作,但 ActionCable.server.config.allowed_request_origins 不工作(但在 config.ru 中工作)?

这不是一个紧迫的问题,因为我有几种解决方法。我只是想知道我是否遗漏了一些关于我认为它应该如何工作的明显信息。

你可以放 Rails.application.config.action_cable.allowed_request_origins = ['http://localhost:3001'] 在你的 development.rb

有关详细信息,请参阅 https://github.com/rails/rails/tree/master/actioncable#allowed-request-origins

this answer 开始,您还可以将以下代码添加到 config/environments/development.rb 以允许来自 httphttps 的请求:

Rails.application.configure do
  # ...

  config.action_cable.allowed_request_origins = [%r{https?://\S+}]
end

config.action_cable.allowed_request_origins 接受字符串数组或正则表达式作为 documentation states:

Action Cable will only accept requests from specified origins, which are passed to the server config as an array. The origins can be instances of strings or regular expressions, against which a check for the match will be performed.

下面列出的正则表达式将匹配来自任何域的 httphttps 网址,因此在使用它们时要小心。使用哪一个只是一个偏好问题。

  • [%r{https?://\S+}] # 取自 this answer
  • [%r{http[s]?://\S+}]
  • [%r{http://*}, %r{https://*}]
  • [/http:\/\/*/, /https:\/\/*/]

对于我的 flutter 应用程序,请求来源为零。因此,需要在列表中添加 nil

我在 config/environments/development.rb 中添加了这段代码,并且有效!

config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/, /file:\/\/*/, 'file://', nil]