在我的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中停止它?

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

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

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

http://guides.rubyonrails.org/rails_on_rack.html如果你以前没有在Rails上下文中暴露过Rack,可能会有所帮助。

另外一个选项是HttpHeadersMoreModule ,因为你使用的是Nginx。 这将允许您精确控制哪些标头沿线传输。

在您的情况下,您特别希望使用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很容易编译,只需按照安装说明操作即可 。

我同意x1a4Stephen McCarth x1a4提出的两个解决方案都很好。

理想情况下你肯定应该使用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提供的中间件解决方案x1a4

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

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