2012-04-25 87 views
4

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

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

+0

应用/ JSON媒体类型的字符集参数也没有意义。 – 2014-11-27 17:21:40

回答

9

你可以用一块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,可能会有所帮助。

8

由于您使用的是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

+0

你不需要在Ubuntu上编译整个NginX,你可以执行'sudo apt-get install nginx-extras',其中包含HttpHeadersMoreModule然而这可能不起作用(在我的Ubuntu 14.04虚拟机上,它抱怨一些旧的依赖不是支持)但我同意,理想情况下,你应该编译你的NginX,如果你想要这个模块。 – equivalent8 2014-11-27 15:50:43

+0

btw一个指令如何建立自己的NginX http://www.eq8.eu/blogs/3-installing-nginx-1-4-4-from-source-on-ubuntu-12-04-precise .. 。如果有人需要 – equivalent8 2014-11-27 15:57:42

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级别上处理这个问题,不是在中间件层面

+使其更SENCE,如果你的nginx是处理几个配置(您没有更新,如果一些变化几个应用程序)

+0

顺便说一句写这个答案时我的NginX版本是1.6.2 – equivalent8 2014-11-27 16:48:04