You need to enable JavaScript to run this app. Hotwire Rails应用跳转外部服务失败:Turbo请求触发CORS错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Hotwire Rails应用跳转外部服务失败:Turbo请求触发CORS错误如何解决

问题原因

该CORS错误是Turbo的默认行为导致的:Turbo会自动拦截所有站内的链接点击、表单提交请求,用Fetch API发起异步请求实现无刷新导航。当你的后端返回跨域重定向地址时,Fetch请求会触发浏览器的CORS预检校验,而Discourse的SSO端点没有配置允许你站点的跨域访问,因此抛出CORS错误。

可行解决方法

你可以从前端或者后端任选一种方案修复:

方案1:前端禁用Turbo对请求的接管

如果你的SSO请求是点击链接触发的,给对应的a标签添加data-turbo="false"属性即可;如果是你提供的Devise登录表单提交后触发的跳转,修改表单配置添加禁用Turbo的属性:

<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: {class: 'mt-48', data: {turbo: false}}) do |f| %>

修改后表单会走原生浏览器提交逻辑,重定向时会触发全页跳转,不会触发CORS校验。

方案2:后端重定向时添加适配Turbo的配置

修改你的sso控制器方法,重定向时明确允许跨域跳转,同时告知Turbo不需要用异步方式处理该重定向:

def sso
  secret = "572890bb92bbef8c4634c1bf"
  sso = SingleSignOn.parse(request.query_string, secret)
  sso.email = current_user.email # from devise
  sso.name = current_user.name # this is a custom method on the User class
  sso.username = current_user.username # from devise
  sso.external_id = current_user.id # from devise
  sso.sso_secret = secret

  redirect_to sso.to_url("https://xxxxxxxx/session/sso_login"), allow_other_host: true, status: :see_other
  response.set_header('Turbo-Visit', 'false')
end

内容的提问来源于stack exchange,提问作者Vishal G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 01:36:04