将Rails中的外部URL重定向不起作用

26 浏览
0 Comments

将Rails中的外部URL重定向不起作用

在控制器中,我尝试执行以下操作:\n

redirect_to @url

\n@url是一个正确格式化的https网址。\n当我执行这个操作时,浏览器中没有任何反应。\n日志显示有一个重定向,但是在Chrome检查中,我看到了以下内容:\n

请求网址:https://..myurl...
请求头警告:显示临时头信息。
来源:http://localhost:3000
引用者:http://localhost:3000/cars/105
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/32.0.1700.76 Safari/537.36
查询字符串参数查看源代码查看URL编码
tId:6f6bfeaf-fd47-42ae-8e43-6b7118d21b0b

\n网络选项卡显示它被取消了。\n我漏掉了什么吗?为什么没有发生重定向?

0
0 Comments

问题:在Rails中重定向到外部URL时无法生效。

原因:在重定向时没有指定要使用的协议为SSL。可以使用ActionController::Base#redirect_to方法的:protocol参数来设置协议为https。

解决方法:可以在控制器中使用before_action方法,在重定向之前执行指定的方法。可以定义一个方法如下:

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

然后在控制器中添加以下代码:

class SpecificController
    before_action :redirect_via_https
end

另外,如果想要强制在自己的页面上使用SSL,可以使用Rails的ForceSSL方法。

注意:在使用params.merge时,如果同时传递了:protocol:host:port参数给url_for方法,可能会存在安全风险。详细信息请参考blog.bmonkeys.net/2014/be-careful-with-params-merge

0
0 Comments

问题的根本原因是浏览器的一些插件,如广告拦截器或网络内部工具,导致Rails重定向到外部URL无法正常工作。当请求被阻止时,浏览器会显示“CAUTION: Provisional headers are shown”的警告信息,因为实际的请求并没有被发送,所以显示的头部信息并不是真实的。为了解决这个问题,可以禁用所有可能阻止请求的扩展程序,然后重新尝试重定向操作。如果你在不同的应用程序中遇到了相同的问题,那么这更加证实了这个理论。我自己也试过在启用广告拦截器的情况下进行重定向操作,结果出现了相同的行为。

0
0 Comments

问题的原因是在AJAX请求中重定向到外部URL是不起作用的。这是因为跨域AJAX请求默认是不被支持的。如果你有对https://..myurl...应用有控制权,你可以实现CORS或JSONP。

编辑:

第三种方法是在AJAX请求完成后,在客户端上进行重定向(通过设置window.location),以绕过对AJAX请求的跨站重定向限制。然而,如果你的最终目标是让重定向在AJAX请求中透明地发生,而不是在请求完成后,你将需要实现CORS或JSONP。

他在下面的评论中说,只有当他添加remote: true时,他的请求才起作用。

更具体地说,他说他添加了remote: true,然后在接收到响应后设置了window.location。换句话说,在AJAX请求完成后,他通过在客户端上进行重定向来解决了跨域AJAX重定向问题。

是的,基本上唯一起作用的方法是使用remote: true,然后手动设置window.location。根据我的搜索,应该可以使用redirect_to _url,无需使用CORS或JSONP。

你找到了哪些文档,表明可以在没有CORS或JSONP的情况下,通过AJAX请求重定向到不同的域名(或者在应用程序内建立外部URL的本地代理)?

我的问题是他从未提到他正在尝试进行AJAX请求。我理解的是他试图使正常的重定向工作。

他在Chrome开发工具的网络选项卡中提到了监控请求。此外,他最终采取的解决方案指向跨域AJAX请求作为根本原因。

提到Chrome开发工具中网络选项卡的原因很重要,因为该选项卡仅显示异步请求;同步请求(例如链接点击或表单提交)不会出现在该选项卡中。

0