【问题标题】:Rails: ActiveResource and Apache RedirectRails:ActiveResource 和 Apache 重定向
【发布时间】:2010-12-21 15:33:37
【问题描述】:

我有 Rails 应用程序,它们使用 ActiveResource 相互通信。我已设置 VHOST 以将每个 HTTP 请求重定向到 HTTPS。这是一个应用程序的 VHOST:

<VirtualHost *.80>
 <Location />
    Redirect permanent / https://my.app.com/
 </Location>
</VirtualHost>

#http requests will forwarded here by the above Redirect
<VirtualHost *.443>

 ....
</VirtualHost>

当我通过浏览器访问时,这会重定向查找,但是当我通过 ActiveResource 发送 HTTP 请求时,它会返回错误:已永久移动。我知道在上述设置中可能会发生这种情况,但是如何应对这种情况并使 ActiveResource 工作,即使它向 HTTP 发送请求(应该转发到 HTTPS)?

谢谢,

伊姆兰

【问题讨论】:

    标签: ruby-on-rails http redirect https activeresource


    【解决方案1】:

    Rails 无法自动重定向 ActiveResource 调用,因为根据 HTTP spec,只有 GETHEAD 请求可以自动重定向。

    因此,来自服务器的重定向将引发 ActiveResource::Redirection 异常,您必须在代码中处理此异常:

    begin
      # Make some ActiveResource calls
    rescue ActiveResource::Redirection
      # Error handling
    end
    

    您可以尝试在 rescue 块中发出新的 HTTPS 请求(可能通过更新 ActiveResource 模型的 site 属性)。但是,您需要围绕所有 ActiveResource 操作进行这种错误处理,这会使您的代码更难阅读和维护。

    因此,我的建议是您不要尝试在代码中处理重定向,而是要求所有连接到您的应用程序的客户端始终使用 HTTPS 版本。

    【讨论】:

    • 标准,感谢您的建议。我只是想知道是否有办法。我同意你的建议。再次感谢。
    【解决方案2】:

    我还没有验证这个工作,但是通过阅读 ActiveResource API 和快速谷歌搜索,也许你可以捕捉到异常,然后尝试获取请求被重定向到的位置,然后使用新的重试操作地点?

         rescue ActiveResource::Redirection => ex
            unless retried
              domain = URI.parse(ex.response['Location']).host
              retried = true and retry # retry operation
            end
          end
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多