1

我有 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)?

谢谢,

伊姆兰

4

2 回答 2

1

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

     rescue ActiveResource::Redirection => ex
        unless retried
          domain = URI.parse(ex.response['Location']).host
          retried = true and retry # retry operation
        end
      end
于 2010-12-21T16:06:05.287 回答
1

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

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

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

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

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

于 2010-12-21T16:13:56.390 回答