【问题标题】:Why does a browser send two requests for the same page when it's refreshed?为什么浏览器在刷新时会为同一页面发送两个请求?
【发布时间】:2013-02-07 14:11:22
【问题描述】:

我创建了一个简单的 Node.js 应用程序,该应用程序为每个传入的 HTTP 请求记录以控制台当前 request.url。当我在 Mac OS X ML 上的 Chrome 中刷新页面时,我收到了对同一页面的两个请求。 为什么?

相比之下,当我使用 curl 并请求同一个页面时,我只收到一个请求。如果我在 Safari 中刷新页面,同样的请求。

为什么 Chrome 会针对同一页面发送两个请求?

编辑:我查看了 request.headers 并发现了一个区别:accept 标头。

这是第一个请求的标头。请注意,它接受特定 mime 列表。

{ host: 'www.pulsr.local:1337',
  connection: 'keep-alive',
  'cache-control': 'max-age=0',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',
  'accept-encoding': 'gzip,deflate,sdch',
  'accept-language': 'en-US,en;q=0.8',
  'accept-charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
  cookie: 'PULSRSESSID=BBtDAWMVgbQZ8lXA6wv4Wg/vwwI=; PULSRSESSID=dsGxP494UxJueit2/u79AFiM5fw=' }

这是第二个请求。这次它接受一切

{ host: 'www.pulsr.local:1337',
  connection: 'keep-alive',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',
  accept: '*/*',
  'accept-encoding': 'gzip,deflate,sdch',
  'accept-language': 'en-US,en;q=0.8',
  'accept-charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
  cookie: 'PULSRSESSID=VGWRSG9zIokHjA2vLa1b+/fUqu8=; PULSRSESSID=dsGxP494UxJueit2/u79AFiM5fw=' }

编辑 2:我检查并发现这两个请求都是 GET 请求。

【问题讨论】:

    标签: http google-chrome networking browser request


    【解决方案1】:

    我认为这与 Chrome 中的 bug 有关,它会在每个请求中发送对网站图标的请求。 Firefox 和其他浏览器在第一次请求时执行此操作,但会将其缓存。

    【讨论】:

    • 不错的猜测,但我已经检查过它在第一个请求时发送了 3 个请求(我提到的 2 个请求 + 1 个用于 favicon 的请求)。之后每个页面只有 2 个请求。
    • 最终,我倾向于相信这个错误是原因。
    【解决方案2】:

    正如在另一个 answer 中发现的那样,它可能是由图像或 iframe 上的空 src 属性引起的。我遇到了同样的问题:当只刷新 1 次页面时,来自 Chromium 的完全相同的页面上的 4 个请求(而不是 favicon 上的)。就我而言,我发现这是由于 link 标签上的空 href 属性:

    <link rel="shortcut icon" href="" />
    <link rel="icon" type="image/x-icon" href="" />
    <link rel="icon" type="image/png" href="" />
    

    因此,我的页面重新加载有 1 个请求,上述 3 个链接中的每个链接都有 1 个请求。

    【讨论】:

    • 我知道这就像 4 岁,但你刚刚救了我的命!我永远不会猜到!
    【解决方案3】:

    注意 chrome 上的萤火虫灯扩展 .. 这是我的问题

    【讨论】:

      【解决方案4】:

      在我的情况下,带有src="#" 的 iframe 导致页面打开两次

      <iframe src="#" class="iframe lazyload" id="youtube-player-iframe" allow="autoplay"></iframe>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多