为啥我的 Github 托管站点响应 HTTP 302 而不是 200?

Posted

技术标签:

【中文标题】为啥我的 Github 托管站点响应 HTTP 302 而不是 200?【英文标题】:Why is my Github-hosted site responding with HTTP 302 instead of 200?为什么我的 Github 托管站点响应 HTTP 302 而不是 200? 【发布时间】:2014-01-20 01:30:52 【问题描述】:

我拥有域 penkov.id.au。我使用github 托管blog,子域michael.penkov.id.au 的A 记录指向github 页面服务器(204.232.175.78)。

bash-3.2$ dig michael.penkov.id.au +nocomments +nocmd +nostats

; <<>> DiG 9.8.3-P1 <<>> michael.penkov.id.au +nocomments +nocmd +nostats
;; global options: +cmd
;michael.penkov.id.au.          IN      A
michael.penkov.id.au.   86400   IN      A       204.232.175.78
penkov.id.au.           14399   IN      NS      ns1.linode.com.
penkov.id.au.           14399   IN      NS      ns5.linode.com.
penkov.id.au.           14399   IN      NS      ns4.linode.com.
penkov.id.au.           14399   IN      NS      ns2.linode.com.
penkov.id.au.           14399   IN      NS      ns3.linode.com.
ns1.linode.com.         62648   IN      A       69.93.127.10
ns1.linode.com.         136520  IN      AAAA    2600:3c00::a
ns2.linode.com.         67499   IN      A       65.19.178.10
ns2.linode.com.         122812  IN      AAAA    2600:3c01::a
ns3.linode.com.         124971  IN      A       75.127.96.10
ns3.linode.com.         133162  IN      AAAA    2600:3c02::a
ns4.linode.com.         96383   IN      A       207.192.70.10
ns4.linode.com.         904     IN      AAAA    2600:3c03::a
ns5.linode.com.         44638   IN      A       109.74.194.10
ns5.linode.com.         56329   IN      AAAA    2a01:7e00::a

最近(大约一个月前,也许更久),我发现所有对子域的请求(例如http://michael.penkov.id.au/blog/2014/01/02/reinventing-the-wheel.html)都会收到 302 响应。对于像 facebook.com 这样的网站来说,这是一个问题,它们不需要访问该 URL 来提供预览。 Github notes 认为 302 重定向不是错误,应该遵循,但 Facebook 显然忽略了这一点。

我使用 Chrome 的调试工具查看了请求和响应标头:

请求:

GET /blog/2014/01/02/reinventing-the-wheel.html HTTP/1.1
Host: michael.penkov.id.au
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,ja;q=0.6,ru;q=0.4
Cookie: __utma=146715829.533338776.1383309288.1383487335.1383547294.7; __utmz=146715829.1383309288.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=118121621.1819750941.1383609188.1387026971.1388676605.15; __utmb=118121621.11.10.1388676605; __utmc=118121621; __utmz=118121621.1387026971.14.7.utmcsr=facebook.com|utmccn=(referral)|utmcmd=referral|utmcct=/
If-Modified-Since: Thu, 02 Jan 2014 14:38:15 GMT

回复:

HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /blog/2014/01/02/reinventing-the-wheel.html

最后,重现此问题的可靠方法是使用Facebook URL debugging tool。将其指向http://michael.penkov.id.au/blog/2014/01/02/reinventing-the-wheel.html 以查看问题。

我的问题:

是什么导致了重定向?是 A 唱片吗? 实际重定向到哪里?我怎样才能找到这个?我该如何解决? 我可以摆脱重定向吗?换句话说,如何让服务器返回 200 而不是 302?具有相同设置的其他网站(例如 http://mdswanson.com/blog/2013/11/13/some-tools-i-like.html)以 200 响应。

【问题讨论】:

我在 github 页面中托管的博客也有同样的问题。这是网址:ajmalvh.com。尝试了很多建议。我认为这没有解决方案。 302 重定向对 SEO 不利。 我在 github 上记录了一张票,如果他们回复我,我会发布更新。 【参考方案1】:

这是我从 github 支持人员那里听到的:

指向 204.232.175.78 的 A 记录是导致 302 重定向的原因。

在我的 DNS 设置中将 A 记录替换为 CNAME(指向 mpenkov.github.com)解决了问题。

作为参考,这是我的 DNS 记录现在的样子:

misha@misha-antec:~$ dig michael.penkov.id.au +nocomments +nocmd +nostats

; <<>> DiG 9.8.1-P1 <<>> michael.penkov.id.au +nocomments +nocmd +nostats
;; global options: +cmd
;michael.penkov.id.au.          IN      A
michael.penkov.id.au.   85536   IN      CNAME   mpenkov.github.com.
mpenkov.github.com.     2736    IN      CNAME   github.map.fastly.net.
github.map.fastly.net.  25      IN      A       103.245.222.133

【讨论】:

【参考方案2】:

巧合的是,我遇到了类似的问题,因为我正在使用 CloudFlare 来管理我在 apex 域上的 DNS 和 GitHub 页面。我有两条 A 记录指向 GitHub Pages 服务器 192.30.252.153 192.30.252.154 和 www 子域上的 CNAME 指向根域。

我向 GitHub 支持询问了我所看到的随机 302 重定向,他们告诉我:

因为您正在使用带有 A 记录的 Cloudflare,所以您遇到了我们的拒绝服务 (DOS) 缓解技术。

为了避免这个问题,您可以使用子域,例如blog.example.com,而不是***域,例如example.com,作为您的 GitHub 页面的 CNAME。此子域将由我们的内容交付网络提供支持,并且不会返回 302。

如果您想使用 apex 域,您需要将它们直接指向 GitHub Pages IP。

幸运的是(或不是),CloudFlare 确实提供了违反 RFC 合规性并允许使用 CNAME records on naked domains 的机会。当然它可能会破坏电子邮件服务,但我对此很好,因为我没有使用它。

希望这对某人有所帮助。

【讨论】:

【参考方案3】:

我收到了一个200 HTTP 响应。:

GET http://michael.penkov.id.au/blog/2014/01/02/reinventing-the-wheel.html

HTTP/1.1 200 OK
Server: GitHub.com
Date: Thu, 02 Jan 2014 16:04:17 GMT
Content-Type: text/html
Connection: keep-alive
Content-Length: 10314
Last-Modified: Thu, 02 Jan 2014 14:38:15 GMT
Expires: Thu, 02 Jan 2014 16:14:17 GMT
Cache-Control: max-age=600
Vary: Accept-Encoding
Accept-Ranges: bytes
Vary: Accept-Encoding

您可能正在等待 Facebook(和其他服务的)DNS 缓存刷新。时间不应超过 48 小时。我有时可以让 Facebook 调试器返回 200,但它仍然有错误,因为页面上的这个 HTML 标记指向其他地方:

 <link rel="canonical" href="http://penkov.id.au/blog/2014/01/02/reinventing-the-wheel.html" />

【讨论】:

我测试了 OPs URL 和示例 URL - 有时它们返回 302,有时返回 200 - 然而大多数时候是 200。重定向会回到自身——可能是 Github 页面中的某种负载平衡。即一个 Github 页面服务器说 - “我没有这个 - 再试一次,这是一个 302 标头”,因此浏览器重新请求相同的 URL,但这次另一台服务器响应“嘿,我有这个东西,这是一个200 标题" @madebydavid 这是一个非常糟糕的负载平衡解决方案,但您的洞察力非常好。如果是真的,没有设置代理,这似乎完全是浪费,我认为这个问题没有解决方案。 我认为 DNS 缓存在这里不是问题,因为在这方面大约半年没有任何变化。我已经修复了错误的 HTML 标签。感谢您指出了这一点。 Facebook 调试器有时仍会给出 302 - 也许它真的只是负载平衡。

以上是关于为啥我的 Github 托管站点响应 HTTP 302 而不是 200?的主要内容,如果未能解决你的问题,请参考以下文章

Go从三个站点中返回响应最快的

Android,http:如何将文件上传到由共享服务器托管的站点?

如何将 Jekyll 站点从 github repo 部署到我的 ftp?

GitHub 页面 https/www 重定向

在多个站点托管一个开源项目[关闭]

如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?