我们已经注意到,当使用nginx内部301和302处理时,nginx将使用合适的Location:…头来提供一个小的文档体。
(在html中):301redirect – nginx。
根据上述行为,还会发送内容types的文本/ html和内容长度标题。
我们做了很多302和301redirect,上面的行为浪费了我们认为的带宽。
任何方式来禁用此行为?
我们的想法之一是将error_page 301 302设置为空文本文件。 我们还没有testing过,但我甚至假设上面,内容types和内容长度(0)标题将被发送。
那么,有没有一种干净的方式发送一个“无身体”301/302redirect与Nginx?
仔细考虑你要求的是什么,并强烈地考虑不要这样做 。
RFC 2616指定您要删除的实体主体应该存在。
10.3.2 301永久移动
新的永久URI应该由响应中的位置字段给出。 除非请求方法是HEAD,否则响应的实体应该包含一个超链接到新URI的短超文本注释。
和…
10.3.3 302发现
临时URI应该由响应中的位置字段给出。 除非请求方法是HEAD,否则响应的实体应该包含一个超链接到新URI的短超文本注释。
在这种情况下,应该在RFC 2119中定义:
这个词或“推荐”这个形容词意味着在特殊情况下可能存在一些理由来忽略一个特定的项目,但是在select不同的课程之前,必须理解和仔细权衡全部的含义。
现在,您可以在不违反RFC的情况下做到这一点,但您应该意识到完整的含义:
curl ,这仍然是常用的。 这个build议已经被RFC 7231略微放宽了,它只是说(对于301和302):
服务器的响应有效载荷通常包含一个超链接到新URI的简短超文本注释。
服务器的响应负载通常包含一个超链接到不同的URI的简短的超文本注释。
是的,你完全可以用NGINX来做!
只需安装一个exception处理程序,即error_page ,以后处理所需的响应。 确保以防止错误页面修改HTTP状态码的方式进行设置,例如,不要使用=参数(或使用它来硬编码任何你想要的代码)。
确保return带有返回状态代码的响应,以便您可以select设置[text] ,而不是URL 。
指定default_type of "" ,这似乎是删除Content-Type标题
这里是完整的代码,也在我的GitHub在StackOverflow.cnst.nginx.conf存储库:
# cat sf.421976.301-302-redirect-w-no-http-body-text.nginx.conf | sed 's#^#\t#g' server { listen 1976; error_page 301 302 @30x; # keep original HTTP status code w/o `=` location @30x { default_type ""; # will remove Content-Type completely # `300` is a filler: client will get the original HTTP status code return 300; } return 301 http://example.su/test; }
这是确认它正常工作:
% curl -i localhost:1976 | sed 's#^#\t#g' HTTP/1.1 301 Moved Permanently Server: nginx/1.2.1 Date: Mon, 28 Aug 2017 22:02:41 GMT Content-Length: 0 Connection: keep-alive Location: http://example.su/test %
我已经在浏览器中试过了,它在那里也工作得很好。
PS另一个select是修改源代码,编辑ngx_http_error_301_page等variables,但为什么要走这条艰难的路线? ^ _ ^
这有点难看,但也许你可以代理301/302请求,并使用proxy_method来更改GET到HEAD请求。 我还没有testing过,但是头部请求应该只发送没有响应或(希望)content- *头的头文件。