ruby-on-rails-3 - 使用 Rails 重定向到外部URL无法工作

  显示原文与译文双语对照的内容

在控制器中,我尝试做

 
redirect_to @url

 

@url 是正确格式化的https url

当我做什么的时候浏览器里什么都没有发生

日志显示有一个重定向,但在 Chrome 检查中我看到


Request URL:https://..myurl...
Request Headers CAUTION: Provisional headers are shown.
Origin:http://localhost:3000
Referer:http://localhost:3000/cars/105
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36
Query String Parametersview sourceview URL encoded
tId:6f6bfeaf-fd47-42ae-8e43-6b7118d21b0b

网络选项卡显示它已经被取消。

我错过什么了为什么重定向不发生?

时间: 作者:

在搜索一段时间后( 警告: 我想这个消息可能不是真正的事情,因为它不是真正的事情。 如你所引用的问题中所解释的,当服务器响应时,真正的头会被更新,但是如果请求被阻止"

可以确保所有能够阻塞请求的扩展都被禁用,然后再次尝试。

根据你在 Chrome的网络选项卡中看到的请求取消的语句,听起来像在在AJAX请求中执行这里操作。 默认情况下不支持跨域AJAX请求。 如果你能够控制 https://..myurl... 应用程序,你可以实现 CORS 或者 JSONP 。

编辑

第三个方法是在客户端重定向完成AJAX请求后,通过在客户端重定向AJAX请求,绕过交叉站点重定向的限制,这是你提到的。 然而,如果最终目标是在AJAX请求的transparently—as部分而不是it—you之后进行重定向,则需要实现CORS或者 JSONP 。

作者:

我认为你需要指定你要使用的协议正在使用 SSL 。 ActionController::Base#redirect_to 方法采用选项散列,其中一个参数是 :protocol,它允许你定义:


redirect_to :protocol => 'https://'

如果将所有重定向都通过SSL进行,那么将它放在控制器的before_action 中是有意义的。 你可以定义如下方法:


def redirect_via_https
 redirect_to :protocol =>"https://" unless (request.ssl? || request.local?)
end

并将它的添加到控制器中:


class SpecificController
 before_action :redirect_via_https
end

作者:

你可以访问该页面并在 Chrome 中查看它,没有任何安全警告?

我没有加载 css 等等,因为我正在通过 https 向一个本地服务器请求未经验证的证书。 在进入url之前,Chrome 可以能正在检查 behind,但是我不知道。

试试 redirect_to https://www.google.com,看看是否能正常工作。

作者:

你的Rails 版本是什么,因为redirect_to方法在外部url中。


class HomeController <ApplicationController
 def index
 @url ="https://facebook.com"
 redirect_to @url
end

它可以工作。

...