将Rails中的外部URL重定向不起作用
将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我漏掉了什么吗?为什么没有发生重定向?
问题:在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。
问题的原因是在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开发工具中网络选项卡的原因很重要,因为该选项卡仅显示异步请求;同步请求(例如链接点击或表单提交)不会出现在该选项卡中。