为啥我的 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?的主要内容,如果未能解决你的问题,请参考以下文章
Android,http:如何将文件上传到由共享服务器托管的站点?