【问题标题】:Ajax request does not preserve full URL (protocol) provided in RailsAjax 请求不保留 Rails 中提供的完整 URL(协议)
【发布时间】:2017-09-26 13:41:53
【问题描述】:

我已经对我的一些观点进行了 ajaxified,但由于某种原因它没有保留 https 并尝试重定向到 http。我有以下代码:

$(function() {
  var polling_url = "#{eligibility_check_polling_phone_details_url}";
  var redirect_url = "#{eligibility_check_result_phone_details_url}";

  var checkResult = function() {
    $.getJSON(polling_url, function(result) {
      if(result.complete) location.href = redirect_url;
      else setTimeout(checkResult, 2000);
    });
  };

  // some more stuff
});

如您所见,我提供了 URL,但它仍然阻止请求,因为它被重定向到 http,这是 XSS 以来不允许的。

谢谢

编辑:显然#{eligibility_check_result_phone_details_url} 出于某种原因返回http:,而所有其他网址都是https:

【问题讨论】:

  • 假设 console.log(redirect_url) 返回一个 https URL,您可以在重定向发生时发布您的服务器日志吗?
  • @NickM redirect_url 实际上是 http: 仅当在那里做日志时,很奇怪。

标签: javascript jquery ruby-on-rails ajax


【解决方案1】:

根据您的评论,由于 console.log('redirect_url') 返回一个 http 链接,您所要做的就是用 Javascript 替换协议:

var https_redirect_url  = redirect_url.replace("http", "https");
if(result.complete) location.href = https_redirect_url;

如果 Rails 正在执行重定向,您会在服务器日志中看到重定向。

如果您希望您的所有路线/助手都是https,您可以将其添加到routes.rb

default_url_options protocol: :https

此外,如果您只想将某些控制器限制为 https,则可以在控制器/命名空间级别执行此操作:

class SomeController < ApplicationController
  force_ssl if: :ssl_configured?

  def ssl_configured?
    !Rails.env.development?
  end
end

【讨论】:

  • 谢谢,但这会是一个安全问题,因为有人可以将其替换回 http 吗?
  • 不一定。他们可以通过在地址栏中输入 http 来做到这一点,所以我不会担心。如果您想在整个应用程序中强制使用 HTTPS,那是另一个问题
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多