【问题标题】:Rails 2.2 doesn't want to redirect from https to http version of a pageRails 2.2 不想从 https 重定向到页面的 http 版本
【发布时间】:2026-02-19 20:30:01
【问题描述】:

我有一个名为“课程”的资源类型。由于技术原因(与 adobe Shockwave 插件有关),一些较旧的课程只能在 http 页面上播放,而不是 https。

我试图在课程控制器的“显示”操作中处理这个问题,如下所示:(ldb 是一个日志记录命令)

def show
  #we can't play shockwave in https, so redirect to http if we're in https mode and the lesson has a shockwave resource
  if @lesson.needs_shockwave? && request.protocol == "https://"
    ldb "request.url = #{request.url}"
    new_url = request.url.gsub(/^https/,"http")
    ldb "redirecting to #{new_url}"
    redirect_to new_url and return
  else
    respond_to do |format|
      format.html 
      format.pdf { render :layout => false }
      format.js
    end
  end
end

我可以在日志中看到它生成了新的 http 版本的 url:

### request.url = https://local.charanga.com/lessons/134726?foo=bar
### redirecting to http://local.charanga.com/lessons/134726?foo=bar

但是,它重定向到的实际 url 在开始时仍然有 https,因此它陷入了不断重定向回自身的循环中。为什么会发生这种情况?

【问题讨论】:

    标签: ruby-on-rails redirect https


    【解决方案1】:

    如果您直接在浏览器中访问http URL,它是停留在http,还是重定向到https?

    如果它重定向,那么值得检查:

    1. 您是否在 Rails 应用程序中强制使用 SSL - 可能在 production.rb 中?

      例如您将拥有config.force_ssl = true。 这将迫使一切回到 https。

    2. 您是否在任何级别重写 URL 以默认使用 https,例如在 nginx 中,使用 rack-rewrite,作为 CloudFlare 规则等?

    【讨论】:

    • 谢谢。在浏览器中,它只是停留在 https 上,看起来就像永远在加载,直到它放弃。我不会在任何地方强制使用 https - 我可以通过手动编辑地址栏中的 url 来转到 http 版本。
    • 编辑:实际上我不能执行上述操作:我将浏览器栏编辑为 http,但它仍然加载 https 版本!因此,这可能是浏览器(Chrome)的错误。我会尝试其他一些浏览器。
    • 对不起,我认为有一些东西(可能在我的 nginx 配置中)毕竟是在强制 SSL。我需要进一步调查...
    • 好的,事情就是这样。在我正在工作的这个 git 分支中,这与使站点在 https 模式下工作有关,我的一位同事(可能过于热心)将此行添加到 nginx 加载的配置文件之一中:add_header Strict-Transport-Security "max-age=3600; includeSubDomains" always;。在使用 https 访问任何页面后,这会在整个站点上强制使用 https 至少一个小时。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
    • @MaxWilliams 很高兴您发现了这个问题。即使将其删除,您也可能会发现 Chrome 会记住重定向。您可以通过转到 https 页面,打开开发控制台,然后右键单击导航栏中的刷新按钮并选择“清空缓存并硬重新加载”来强制它忘记。您可能已经知道这一点,但我想我会提到它 - 因为它在过去拯救了我!