Rails App HTTP到HTTPS重定向不适用于Exposed API

时间:2015-03-20 13:59:11

标签: ruby-on-rails api ssl heroku http-status-code-301

我正在构建一个包含前端网站和公开API的Rails 4应用程序。 API用作移动应用和桌面应用的后端。

我在 Heroku 上部署了该应用。由于该网站有订购系统,我决定强制全球推广。当我发出HTTP请求时,该站点成功地将我重定向到HTTPS。

但是,当我从命令行使用cURL向我公开的API发出HTTP请求时,我没有得到预期的响应。相反,我在Heroku日志中看到301状态消息(见下文)。当我通过HTTPS使用cURL发出相同的请求时,一切正常,我得到了成功的响应。

因此除了API之外,HTTP请求将被成功重定向到HTTPS。但是,API仍然可以正确响应HTTPS请求。

我做错了什么?如何允许用户向我的API发出HTTP请求,而只是通过HTTPS重定向他们的请求,就像在应用程序的其余部分一样?这没有意义吗?

我正在使用它在我的控制器中强制使用https:

# /app/controllers/api/v1/pairings_controller.rb
before_filter :redirect_to_https
...
def redirect_to_https
  redirect_to :protocol => "https://" unless (request.ssl? || request.local?)
end

我也试过

# config/application.rb
config.force_ssl = (ENV["ENABLE_HTTPS"] == "yes")
config.ssl_options = {hsts: {expires: 1209600}}

Heroku日志:

HTTP不成功:

2015-03-20T13:40:26.590091+00:00 heroku[router]: at=info method=POST path="/api/v1/pairing/request" host=xxx.herokuapp.com request_id=f832239b-d352-43ed-b5c6-e8d6c9f7c242 fwd="23.27.14.153" dyno=web.1 connect=1ms service=11325ms status=200 bytes=540
2015-03-20T13:40:26.585221+00:00 app[web.1]: Completed 200 OK in 4954ms (Views: 0.3ms | ActiveRecord: 20.3ms)
2015-03-20T13:45:43.502413+00:00 heroku[router]: at=info method=POST path="/api/v1/pairing/request" host=xxx.herokuapp.com request_id=dd633b85-a70b-4a2d-bb39-b450972bb2ab fwd="23.27.14.153" dyno=web.1 connect=1ms service=1739ms status=301 bytes=211

使用HTTPS成功:

2015-03-20T13:40:19.113646+00:00 app[web.1]: Started POST "/api/v1/pairing/request" for 23.27.14.153 at 2015-03-20 13:40:18 +0000
2015-03-20T13:40:21.064630+00:00 app[web.1]: Processing by Api::V1::PairingsController#post_pairing_request as JSON
2015-03-20T13:40:21.631071+00:00 app[web.1]:   Parameters: {"flags"=>"xxx", "otp"=>"xxx", "phone"=>"xxx", "pin"=>"xxx", "user"=>{"address"=>"xxx", "city"=>"Ripley", "email"=>"xxx", "name"=>"xxx", "state"=>"xxx", "zip"=>"xxx"}, "pairing"=>{"pin"=>"xxx", "phone"=>"xxx", "otp"=>"xxx"}}
2015-03-20T13:40:26.590091+00:00 heroku[router]: at=info method=POST path="/api/v1/pairing/request" host=xxx.herokuapp.com request_id=f832239b-d352-43ed-b5c6-e8d6c9f7c242 fwd="23.27.14.153" dyno=web.1 connect=1ms service=11325ms status=200 bytes=540
2015-03-20T13:40:26.585221+00:00 app[web.1]: Completed 200 OK in 4954ms (Views: 0.3ms | ActiveRecord: 20.3ms)

1 个答案:

答案 0 :(得分:1)

问题不在于您的Rails应用程序 - 它正确回复了301重定向消息,指向不使用https的连接。

由客户决定是否遵循301重定向。我的猜测是你的网络浏览器遵循重定向,但cURL没有。

也许这可以提供帮助:Is there a way to follow redirects with command line cURL