2015-04-01 70 views
0

客户端正在向服务器发送带有重复标题的请求。例如:nginx能处理重复的HTTP头文件吗?

GET /somefile.txt HTTP/1.1 
Host: example.com 
Accept: */* 
If-Modified-Since: Tue, 31 Mar 2016 20:00:12 GMT 
If-Modified-Since: Tue, 31 Mar 2016 20:00:12 GMT 
If-Modified-Since: Tue, 31 Mar 2016 20:00:12 GMT 

Apache通过将所有重复头与“,”连接起来处理这个请求。因此,产生的(处理的)请求将如下所示:

GET /somefile.txt HTTP/1.1 
Host: example.com 
Accept: */* 
If-Modified-Since: Tue, 31 Mar 2016 20:00:12 GMT, Tue, 31 Mar 2016 20:00:12 GMT, Tue, 31 Mar 2016 20:00:12 GMT 

但nginx正在返回代码400(错误请求)。现在我无法修改客户的行为。我需要在Nginx服务器上处理这些请求的tmp解决方案(例如Apache)

谢谢。

回答

1

头部“If-Unmodified-Since”的唯一性检查是硬编码的(请参阅[1][2])。它不能被禁用或解散,因为Nginx在分析过程中验证头文件,也就是说,在任何其他处理程序或配置选项可以截获该进程之前,处于请求处理的很早阶段。所以,正确的答案是否定的,不幸的是,没有正确的方法让Nginx忽略这个问题。

但是,有一个肮脏的解决方法。它利用了Nginx只分析一次请求头并在内部重定向后不重新验证它们的事实。这意味着您可以使用error_page拦截400错误,然后在内部将请求重定向到同一位置:

# = is important here! 
error_page 400 = @workaround; 

location @workaround { 
    rewrite ^(.*)$ $1 break; 
} 

但要注意,因为这是不Nginx的是如何打算工作,有这个几个严重的缺点解决方法:

1)仅将“If-Unmodified-Since”的第一个值传递给后端。

2)由于Nginx在遇到错误后停止解析请求标头,因此根本不会在“If-Unmodified-Since”之后传递的标头传递给后端。

第二个缺点实际上可能相当重要,所以我个人不推荐使用这种方法。

+0

感谢您解释详细信息。好像我现在必须切换到Apache ... – oleynikd 2015-04-02 10:36:32