在我的rails答案中删除不必要的HTTP标头

时间:2012-04-25 20:34:23

标签: ruby-on-rails http

我目前正在开发一个大小很重要的API:我希望答案包含尽可能少的字节。我优化了我的JSON答案,但rails仍然响应许多奇怪的标题

HTTP/1.1 200 OK
Server: nginx/0.7.67                            # Not from Rails, so ok.
Date: Wed, 25 Apr 2012 20:17:21 GMT             # Date does not matter. We use ETag Can I remove this?
ETag: "678ff0c6074b9456832a710a3cab8e22"        # Needed.
Content-Type: application/json; charset=utf-8   # Also needed.
Transfer-Encoding: chunked                      # The alternative would be Content-Length, so ok.
Connection: keep-alive                          # Good, less TCP overhead.
Status: 200 OK                                  # Redundant! How can I remove this?
X-UA-Compatible: IE=Edge,chrome=1               # Completely unneded.
Cache-Control: no-cache                         # Not needed.
X-Request-Id: c468ce87bb6969541c74f6ea761bce27  # Not a real header at all.
X-Runtime: 0.001376                             # Same goes for this
X-Rack-Cache: invalidate, pass                  # And this.

所以有很多不必要的HTTP标头。我可以在我的服务器(nginx)中过滤它们,但有没有办法直接在rails中停止它?

3 个答案:

答案 0 :(得分:10)

您可以使用一个Rack中间件来完成此操作。有关在一个中执行此操作的示例,请参阅https://gist.github.com/02c1cc8ce504033d61bf

将其添加到您的应用配置时,请使用config.middleware.insert_before(ActionDispatch::Static, ::HeaderDelete)

之类的内容

您希望在运行rake middleware时显示的列表中的第一项之前插入它,在我的情况下为ActionDispatch::Static

如果你之前没有在Rails上下文中暴露过Rack,那么

http://guides.rubyonrails.org/rails_on_rack.html可能会有所帮助。

答案 1 :(得分:9)

另一个选择,因为你正在使用Nginx,是HttpHeadersMoreModule。这样您就可以精确控制哪些标题沿线传输。

在您的情况下,您特别希望使用more_clear_headers指令,因为:

more_clear_headers Server Date Status X-UA-Compatible Cache-Control X-Request-Id X-Runtime X-Rack-Cache;

这也会清除Server标题,因为它不是必需的,如果你想保存字节,每一点都有帮助。

这个模块确实需要你自己编译Nginx,但这真的不应该吓到你。 Nginx很容易编译,只需按照installation instructions

答案 2 :(得分:0)

我同意x1a4Stephen McCarth提供的两种解决方案都很好。

理想情况下你绝对应该使用HttpHeadersMoreModule但是如果有人喜欢我的本机Ubuntu NginX软件包的安全更新,(或者你没有时间,或者只是懒惰)这是必要的。

另一种方法是使用proxy_hide_header

server {

  location @unicorn {

    # ...
    proxy_hide_header X-Powered-By;
    proxy_hide_header X-Runtime;
    # ...
  }
}

注意:@unicorn只是upsteram服务器,位置可以是//assets,...

现在针对此解决方案的一个参数是,如果您在配置中使用多个服务器块,则需要为每个服务器块指定proxy_hide_header。是的,但你可以创建文件并包含它

# /etc/nginx/sites-enabled/my_app
server {

  location @unicorn {

    # ...
    include /etc/nginx/shared/stealth_headers
    # ...
  }
}

# /etc/nginx/shared/stealth_headers
proxy_hide_header X-Powered-By;
proxy_hide_header X-Runtime    

那么为什么我认为这个解决方案比使用x1a4提供的中间件解决方案更好?

之前我有类似的中间件解决方案,并且工作正常几个月。然后有一天,我们停止通过异常监控工具party_foul gem收到异常错误。长话短说中间件是棘手的,我们做了一些代码更改,这个中间件抛出了异常,但它抛出的异常并没有被中间件捕获,而是假设要监视异常。所以是的,整个事情都是我的坏事,我应该更好地关注我的代码,而不是做愚蠢的事情,因为我有难以抹去的不愉快的经历,所以我只是建议你是否愿意在NginX上处理这个问题级别,而不是中间件级别

+如果您的NginX正在处理多个配置(如果有些更改,您不必更新多个应用程序)会更加明显。