【问题标题】:how to clear the winsock cached http redirects (301 permanently moved)如何清除winsock缓存的http重定向(301永久移动)
【发布时间】:2020-02-08 07:03:39
【问题描述】:

我正在使用 winsock 向 Internet 发送 http 请求。我发现我计算机系统中的某些东西缓存了 http 301 永久移动的响应。因此,如果我为某个 URL 发送一个 GET 请求,它会返回一个旧响应,而不会将任何内容发送到网络上。问题,因为缓存的响应有问题。我想清除缓存,但甚至不知道谁在做缓存。

我知道如何清除浏览器中的缓存。另外,当我使用 wininet 而不是 winsock 时,没有问题。 winsock 的缓存在哪里,如何清除它?

编辑:安德烈亚斯在下面的回应引发了一些评论。我的程序在 localhost 上作为代理运行,接收来自 Firefox 的请求并将它们发送到网络上。因此请求是由 Firefox 设置的,并且主机标头始终存在。我认为这与我自己计算机上的 winsock 有关的原因是,如果我不使用代理服务器,Firefox 会正常获取页面。然后没有301响应。但是 Firefox 也有这个问题(没有代理),直到我清除了它的历史(忘记这个网站)。所以我觉得一定是winsock缓存问题。

由于 Firefox 在其缓存被清除时成功(没有代理),它不能是我的 ISP 进行缓存。请注意,无论是否通过我的代理,发出的请求都是相同的。我什么都不改变。另外,正如我所说,wininet 可以工作。

我同意 winsock 对 http 一无所知。然而,winsock 和具有缓存功能的 web 之间似乎存在某种东西。还能有什么其他解释?我的代理在许多其他站点上都可以正常工作,但是在一些站点上,我得到了这个 301 永久移动的响应,其中包含错误的位置标头。我怎样才能了解更多关于正在发生的事情?

【问题讨论】:

  • 你是说你有这个问题不仅仅是一个站点,而是几个站点?导致您获得 HTTP 301 响应的不止一个物理 HTTP 服务器?或者它可能是同一个物理服务器,只是一个不同的virtual server
  • 您是自己编写了这个代理程序还是只是使用了别人的程序?如果您自己编写代码,您的代理程序究竟是做什么的?它是否只是将它从一个 TCP 连接接收到的所有内容原样转发到另一个 TCP 连接?或者 ist 是否以某种方式改变了内容?不管怎样,我看不到任何缓存的机会,除了transparent proxy。因此,假设您是自己编写的,我怀疑您的程序中存在错误。
  • 假设您自己编写了代理程序,如果您的程序生成了一个包含它接收的所有内容以及它成功发送的所有内容的日志文件(!)(不是未成功尝试发送),它可能会有所帮助。此信息可能有助于诊断问题。例如,它应该准确记录 Winsock send 函数实际发送了多少字节(而不是它试图发送多少)以及发送是否成功。记录实际内容也可能会有所帮助。
  • 是的,有几个站点导致了这个问题,我现在怀疑这是某些服务器或子服务器中的错误。毕竟不是缓存问题。据我所知,所有问题站点都使用 PHP 子服务器。我现在的假设是,如果我执行 GET example.com 错误会生效,但如果我执行 GET / 则一切正常。我会尽快对此进行测试。据我记得,当 Firefox 成功时,它总是后者。但由于某种原因,它总是将前者发送到我的代理。
  • 是的,我自己编写了代理程序。它做了代理应该做的事情。它除了转发请求和响应之外什么都不做。不过,我的目的是通过其他不具备完整代理能力的跃点进行过滤和代理,但这还没有实现。如果我的程序中存在错误,它如何在大多数网站上正常工作?

标签: http redirect caching winsock


【解决方案1】:

Winsock 不缓存网页。它对 HTTP 一无所知,因此无法缓存 HTTP 响应。

如果您确实仅使用 Winsock 发送 HTTP 请求,并且您是直接执行此操作(而不是通过代理),那么它必须是 transparent proxy 正在缓存请求。一些 ISP 使用它们,这通常会导致技术问题。

但是,我不相信这是一个缓存问题。如果您使用 Winsock 发送 HTTP 请求,我怀疑您的 HTTP 请求更有可能出现问题。例如,现在许多服务器使用虚拟主机,因此要求客户端在 HTTP 标头中发送“Host”字段,以便可以将请求分配给正确的虚拟服务器。如果您不这样做,您将被错误的虚拟服务器提供服务。这可能是您收到 HTTP 301 永久移动响应的原因,也可能是它与 WinInet 一起使用的原因(因为它发送正确的“主机”标头字段)。

但是,这与您声称为某个 URL 发送 GET 请求不会将任何内容发送到 Internet 的说法相矛盾。究竟是什么让你认为情况如此?你在使用网络数据包嗅探器吗?

【讨论】:

  • 不管虚拟主机如何,Host 标头在所有 HTTP 1.1 请求中都是必需,但在 HTTP 1.0 请求中是可选。跨度>
【解决方案2】:

我想我现在已经找到了。毕竟不是缓存问题。某些服务器或子服务器中存在错误。一些常见的服务器框架,如 PHP。错误是这样的:如果我使用完整的 url (GET http://example.com) 请求站点的根文档,那么它会返回带有错误位置标头的 301 永久移动响应。如果我使用 GET / 请求它,那么它会起作用,并且我会以 200 OK 状态返回该文档。

所以我现在要做的是检查目标是否是绝对url。如果是这样,我检查路径是否为空。如果是,我将目标更改为 /。

现在它可以工作了,我不再收到 301 响应。

【讨论】:

  • 根据section 5 of RFC 2616,所有 HTTP/1.1 服务器“必须接受请求中的 absoluteURI 形式,即使 HTTP/1.1 客户端只会在对代理的请求中生成它们”。因此,假设 HTTP 请求符合 HTTP/1.1,它似乎确实是一个错误。您是否在请求中指定了 HTTP 版本?如果不是,那么您使用的是 HTTP/0.9(我认为它不支持绝对URI)。
  • 有趣的信息。我不知道客户端仅在通过代理工作时才生成它们。是的,它是 HTTP/1.1,我确实指定了: GET example.com HTTP/1.1 。这一定是这个错误很少让人感觉到的原因。没有多少人通过代理,也许标准代理会像我现在一样改变目标。所以这个bug很难被发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2018-07-26
相关资源
最近更新 更多