我们很难调试网站上的 400 错误。我们有很多这样的错误:
10.0.0.1 - - [08/Oct/2018:14:28:07 +0200]
"GET /les-news/palmares/detail/article/la-lettre-de-motivation-ideale-pour-une-demande-de-stage-5224/
HTTP/1.1" 400 131844
"https://www.google.com/"
"Mozilla/5.0 (Linux; Android 7.0; TECNO K7 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36"
一位用户通过电子邮件报告了该问题,并通过在其浏览器中重置 cookie 解决了该问题,因为其他重置 cookie 是不够的(但我们不能确定是否正确完成)。
该平台相当复杂,由F5 负载均衡器,根据请求的路径转发到不同的服务器。
我首先想要的是能够重现该错误,因为当访问 URL 时我们没有任何错误,并且一切正常。
我们注意到大多数错误来自 Android/Chrome:约占所有 400 错误的 85%。
以下是完整日志:
timestamp October 8th 2018, 16:26:52.000
version 1
_id BmQSVGYB5vF-Dw_g1gVi
_index f5_access-2018.10.08
_score -
t _type doc
t agent Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36
client_ip 10.0.0.1
client_port 41,068
facility local2
host mydomain.fr
httpversion 1
id 2,503,307,391
length 0
logsource mydomain.network.local
message virtual=/Common/mydomain.fr_HTTP client_ip=10.0.0.1 client_port=41068 lb_server=10.153.161.12:80 host=mydomain.fr request_port=80 username= request="GET / HTTP/1.1" server_status=400 content_length=0 resp_time=23 user_agent="Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36" referer=http://mydomain.fr/article/100-millions-d-euros-sciences-po-lance-la-plus-grande-levee-de-fonds-de-son-histoire_095255b4-caef-11e8-896c-7d05c73a49da/ ID=2503307391 timestamp=2018-10-08T16:26:52+0200 pool=/Common/POOL_ETUDIANT_v2_nocache
pool POOL_MYDOMAIN_v2_nocache
program f5_access
referer http://mydomain.fr/article/100-millions-d-euros-sciences-po-lance-la-plus-grande-levee-de-fonds-de-son-histoire_095255b4-caef-11e8-896c-7d05c73a49da/
request /
request_port 80
server_ip 10.0.0.1
server_port 80
severity Informational
status 400
stdstatus 4xx
stdvirtual mydomain_fr_HTTP
tags f5_access
time 23
timestamp October 8th 2018, 16:26:52.000
type f5_access
verb GET
virtual mydomain.fr_HTTP
答案1
这很可能是由客户端引起的,而不是由服务器引起的(当然,间接地也可以)。如果它不仅仅是格式错误的 URL(在能够触发 404 之前被 400 阻止的 URL),那么在 99% 的情况下,这是由
- 损坏的 cookie(例如可能由扩展导致)
- 阻止 Cookie
- 太多 cookie(某些浏览器会阻止大量 cookie)
- 客户端尝试欺骗性请求(我认为是无意的)
如果您想测试阻止 cookie 假设,请在浏览器上阻止 cookie,看看是否出现 400 错误,其余部分有点棘手,请参阅:https://airbrake.io/blog/http-errors/400-bad-request
既然您已经说过通过刷新 cookie 可以修复该问题,那么我认为该问题与 cookie 有关。
编辑:
我有另一个角度:请求是通过 http(未加密)进行的,并且包含带有字符串“用户名”的 GET 请求的引荐来源。这实际上使得访问带有该引荐来源的网站的用户在其标头中可识别,更重要的是,中间人可以以明文形式查看该请求。
由于 Google 已经开始了一场针对未加密 http 流量的战争,我可以假设 Chrome 会造成一些问题。不过这只是一个假设,我无法证实或支持这一点。但值得一试,因为无论如何你都应该加密你的流量。
您的服务器上是否设置了 https?如果是,您是否可以尝试在使用 https 时重现相同的错误?