嘿。您是“Fediverse”爱好者之一吗?你的核心足够强大来运行其中一些东西的实例吗?您经营 Pleroma 吗?是2.7.0版本吗?如果是这样,您可能应该采取一些措施,例如升级到 2.7.1 等。
根据我自己对 Web 服务器日志中真正不良行为的调查,2.7.0 中存在某些内容,导致愚蠢的事情发生。它是这样的:首先,它出现并做了一个 HEAD。然后它返回并执行 GET,但它在标头中发送完全无意义的内容。 Apache 讨厌它,它得到了 400 分。
我说的废话是什么意思?我的意思是在*请求中*发送诸如“etag”之类的内容。你猜怎么着,这是一个服务器端标头。或者,在请求中*发送“内容类型”和“内容长度”。同样,这些都是服务器端标头,除非您发送正文,为什么要在 GET 上这样做呢?
我的意思是,说真的,我在尝试理解这种行为时遇到了真正的问题。谁在请求中发送此类内容,对吗?为什么?
这是我在入境方面看到的东西:
原始标题{ 名称:“用户代理” 值:“Pleroma 2.7.0-1-g7a73c34d;<犯罪方已删除>” } 原始标题{ 名称:“日期” 值:“2024 年 12 月 5 日星期四 23:52:38 GMT” } 原始标题{ 名称:“服务器” 值:“阿帕奇” } 原始标题{ 名称:“最后修改” 值:“2024 年 4 月 30 日星期二 04:03:30 GMT” } 原始标题{ 名称:“etag” 值:“\”26f7-6174873ecba70\“” } 原始标题{ 名称:“接受范围” 值:“字节” } 原始标题{ 名称:“内容长度” 值:“9975” } 原始标题{ 名称:“内容类型” 值:“文本/html” } 原始标题{ 姓名:“主持人” 值:“rachelbythebay.com” }
发送日期和服务器?什么什么什么?
昨晚,我终于厌倦了在他们的 git 仓库中挖掘,我想我找到了确凿的证据。我根本不了解 Elixir,所以这可能在多个层面上都是错误的,但一些愚蠢的事情似乎随着 7 月份的提交而发生了变化,导致:
def rich_media_get(url) 做 headers = [{"user-agent", Pleroma.Application.user_agent() <> "; Bot"}] 与 {_, {:ok, %Tesla.Env{状态: 200, headers: headers}}} <- {:head, Pleroma.HTTP.head(url, headers, http_options())}, {_,:确定} <- {:content_type,check_content_type(标题)}, {_,:确定} <- {:content_length,check_content_length(标题)}, {_,{:好的,%Tesla.Env{状态:200,主体:主体}}} <- {:get, Pleroma.HTTP.get(url, headers, http_options())} 执行 {:好的,身体}
现在,基于我对这些东西的混乱理解,这只是一个猜测,但它确实看起来像是用用户代理填充“标头”,然后将其作为 HEAD 触发。然后它获取*传入的*标头,将它们添加到其中,然后扭转整个混乱状态并将其作为 GET 发送。
假设我是对的,那就可以解释真正奇怪的行为。
大约一个月后,又进行了一次提交,代码发生了很大的变化,包括一个明显的变化,即在第二个请求时不将“标头”发送回门外:
defp head_first(url) 做 与 {_, {:ok, %Tesla.Env{状态: 200, headers: headers}}} <- {:head, Pleroma.HTTP.head(url, req_headers(), http_options())}, {_,:确定} <- {:content_type,check_content_type(标题)}, {_,:确定} <- {:content_length,check_content_length(标题)}, {_,{:好的,%Tesla.Env{状态:200,主体:主体}}} <- {:get, Pleroma.HTTP.get(url, req_headers(), http_options())} 执行 {:好的,身体} 结尾 结尾
现在,两个请求都调用一个函数(req_headers),该函数本身只提供用户代理,如前所述。
令人沮丧的是,对此的提交并没有解释它正在修复无法获取链接预览或任何类似内容的问题,因此 2.7.1 的变更日志也没有说明这一点。这意味着该产品的用户不知道是否应该升级到 2.7.0 以上。
嗯,我正在改变这一点。这是您升级后的通知。请停止对我重复标题。我知道我的服务器是以鸟的名字命名的,但他们真的不想以这种方式喂食。
…
开发人员需要注意的一点是:有了版本号,甚至 git commit 哈希值,就可以将这个东西括起来。如果没有用户代理中的那些内容,我将一直试图根据行为开始的日期来找出答案,这从来都不是一件有趣的事情。从“git commit”到实际用户造成混乱的管道可能相当长。
所以,无论是谁做到了这一点,谢谢你。