DXA 1.2 - Http探针请求在头部缺少Accept或Content-Type参数时失败


6

在最近升级到DXA 1.2后,注意到引入了新的PageControllerhandleGetPageFormatted(),它被假设用于响应格式化(大多数不是文本/ html)为请求的资源输出。

几乎大部分时间都可以正常工作,除非在请求中没有Accept头参数。 DefaultDataFormattergetHtmlAcceptScore()在缺少Accept头参数的情况下给出空指针异常。

在我们的我们正在使用光油高速缓存,它被配置为我们的负载平衡器设置的一部分。此清漆缓存探测应用程序框的可用性。如果服务器无法响应探测器,则表明他们病态且无法访问。调查后明白默认情况下它不会发送任何头文件。下面探头设置:

backend www1 { 
    .host = "xx.xx.xx.xx"; 
    .port = "80"; 
    .probe = { 
    .url = "/"; 
    .interval = 5s; 
    .timeout = 3s; 
    .window = 5; 
    .threshold = 3; 
    } 
} 

由于具有消耗属性设置handleGetPageFormatted()@RequestMapping,能解决问题。因为这意味着只映射接受特定类型媒体类型的请求。

将尝试此并更新此案例。

有没有人遇到类似的问题。

编辑:另一种解决方法是将Accept头作为Probe请求本身的一部分发送,而这并不是DXA早期版本中的要求。示例如下:

.request = 
    "GET /probe.cgi HTTP/1.1" 
    "Host: 127.0.0.2" 
    "Connection: close" 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
    "Accept-Encoding: foo/bar" ;  
4

通过对Accept头执行空检查修复上述空指针问题。更改需要在DefaultDataFormattergetHtmlAcceptScore()BaseFormattergetValidTypes(List<String> allowedTypes)操作中完成。

现在Varnish缓存能够成功探测应用程序。我们现在不需要更改@RequestMapping或在Varnish缓存中。