为什么我的Github托管站点使用HTTP 302而不是200响应?

mpe*_*kov 14 dns redirect facebook http github

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

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
Run Code Online (Sandbox Code Playgroud)

最近(大约一个月前,也许更多),我发现所有对子域的请求(例如http://michael.penkov.id.au/blog/2014/01/02/reinventing-the-wheel.html)遇到302响应.对于像facebook.com这样的网站来说,这是一个问题,它不会费心访问该网址来提供预览.Github 指出,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
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /blog/2014/01/02/reinventing-the-wheel.html
Run Code Online (Sandbox Code Playgroud)

最后,重现此问题的一种可靠方法是使用Facebook URL调试工具.请将其指向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响应.

mpe*_*kov 15

这是我从github支持中听到的内容:

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

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

作为参考,这是我的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
Run Code Online (Sandbox Code Playgroud)


小智 12

巧合的是,我遇到了类似的问题,因为我正在使用CloudFlare在顶点域上管理我的DNS和GitHub页面.我有两个指向GitHub页面服务器的A记录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记录.当然它可能会破坏电子邮件服务,但我很好,因为我没有使用它.

希望这有助于某人.