当前位置: 首页 > 知识库问答 >
问题:

Rails应用程序HTTP到HTTPS重定向不适用于公开的API

卢树
2023-03-14

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

我在Heroku上部署了这个应用程序。因为网站有一个订购系统,我决定强制ssl全球。当我发出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个答案

董昕
2023-03-14

问题不在于你的Rails应用程序——它通过301重定向消息正确响应到不使用https的连接。

由客户端执行301重定向。我的猜测是您的web浏览器遵循重定向,但cURL没有。

也许这能有所帮助:有没有一种方法可以用命令行cURL跟踪重定向

 类似资料:
  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 我的服务器正在从http重定向到HTTPS。我希望允许使用http和HTTPS访问我的应用程序。我怎么能这么做?在我的Wildfly8.2日志中有这样两行:

  • 我正在尝试将所有http流量的重定向配置为仅重定向到https。我的配置如下 我们使用的是弹性负载均衡和 EC2 实例 在这种情况下,已配置应用程序负载均衡器。 后端服务器正在使用 Nginx 在端口 443 上工作 为 http 到 https 重定向配置了 Nginx 重定向规则 为端口 80 和 443 配置了 ELB 侦听器 在支持的服务器和 ELB 中都安装了 SSL 证书 我的问题是,

  • 问题内容: __Apache 环境中心 尝试设置从http到https的自动重定向 我尝试将以下内容添加到我的httpd.conf中,但是没有用 有任何想法吗? 问题答案: 我实际上已经遵循了这个示例,并且对我有用:) 然后做:

  • 奇怪的问题。我使用FullCalendar向服务器上的endpoint发起ajax请求。终点是: 请注意,它是显式的HTTPS。但是,当我发起一个请求时(即当Fullcalendar发起一个请求时),我会得到一个301和一个到非HTTPSendpoint的重定向: 因为页面是通过HTTPS加载的,所以失败。 endpoint工作正常--当我将它加载到浏览器中时,我会得到预期的json输出(通过ht

  • 问题内容: 我正在一个购物车网站上工作,我想在用户输入帐单明细时将用户重定向到HTTPS页面,并保持下一页的HTTPS连接,直到他注销。 为此,我需要在服务器上安装什么(我正在使用Apache),如何从PHP进行重定向? 问题答案: 尝试这样的事情(应该适用于Apache和IIS):