在 GitHub 托管的网站如何进行 301 重定向?

68

这是我的Github存储库: https://github.com/n1k0/casperjs

有一个gh-pages分支用于保存项目文档,基本上是项目网站: https://github.com/n1k0/casperjs/tree/gh-pages

该分支在http://n1k0.github.com/casperjs/设置文档站点 - 太棒了。

同时,我已经购买了casperjs.org域名以便通过它访问该网站,因此我按照文档中推荐的方式放置了一个CNAME文件: https://github.com/n1k0/casperjs/blob/gh-pages/CNAME——在他们的示例中,该操作应该从www.example.com和charlie.github.com创建重定向到example.com...

虽然网站现在指向http://casperjs.org/,但是旧的网站链接http://n1k0.github.com/casperjs/并没有301重定向到新的域名。

有什么想法可以设置这样的重定向吗?如果可能的话,这是一个错误吗?如果是,我应该在哪里提出问题?


2
+1。我也更希望我的页面只能通过域名访问。 - James M
啊,我发誓在提问之前已经彻底搜索了,对不起:$ 编辑:实际上问题并不完全相同,下面有一些有见地的评论 :) - NiKo
可能是在Jekyll和GitHub Pages中重定向旧页面的最佳方法是什么?的重复问题。 - Ciro Santilli OurBigBook.com
9个回答

42

提起这个话题是为了提醒大家,GH现在支持redirect-from的redirect-to参数https://github.com/jekyll/jekyll-redirect-from#redirect-to

只需将此添加到您的_config.yml文件中即可。

gems:
  - jekyll-redirect-from

将此添加到您的索引页面顶部。

---
redirect_to: "http://example.com"
---

34
不错的解决方案,但值得指出的是这个宝石会创建一个带有 meta refresh 重定向的 HTML 页面,而不是基于 HTTP 的重定向。 - Maximillian Laumeister
最近修复了一个严重的默认布局错误:https://github.com/jekyll/jekyll-redirect-from/pull/106,正在等待上游处理;-) - Ciro Santilli OurBigBook.com
这在我的 GitHub 页面 URL 上(以 .github.io 结尾的那个)给了我一个“404 文件未找到”的错误。 - TheChymera
5
除了@MaximillianLaumeister之外,这意味着它是HTTP级别200而不是301。这意味着您将失去页面的SEO价值。 - Remi
2
只是提一下,如果你使用的是 gitlab 而不是 github,那么你需要使用 plugins 而不是 gems - ghosh'.

16

不行。

其他答案提到了使用meta refresh或javascript进行重定向。但是,OP询问的是301重定向。答案是:不行。这是因为你在GitHub Pages上的站点是静态的,所以你无法控制服务器。


1
这是唯一完全正确的通用答案,因为所有其他答案都假定HTML内容将由浏览器解析。例如,如果您有一个.tgz文件,想要从其他地方提供但作为本地URL提供,那么上述任何解决方案都不起作用,因为该文件被作为application/octet-stream提供。 - dannysauer

15
为了避免重复内容,首先您可以添加一个类似这样的元标记canonical:
<link rel="canonical" href="http://casperjs.org">

1
啊,是的,我忘记了这个,谢谢你的提示 :) 但这并不能解决主要问题,即缺乏永久重定向,不幸的是 :/ - NiKo

8
您可以使用JavaScript在主机检测后进行重定向,例如:

您可以像这样:

if (window.location.href.indexOf('http://niko.github.com') === 0) {
    window.location.href = 'http://casperjs.org{{ page.url }}';
}

但是我同意,这不是一个HTTP重定向。


1
问题在于它无法解决我现在遇到的“谷歌重复内容”问题... :/ - NiKo
11
同时,您可以在页面中添加rel="canonical"属性,这样Google就不会将这些页面标记为“重复内容”:http://support.google.com/webmasters/bin/answer.py?hl=en&answer=139394 - cyberdelia
4
这是Github支持团队提供的官方回答:“像那样的重定向目前在页面上不可能。我们可能会在未来添加此功能。您可以使用一些JavaScript技巧来实现重定向,这就是我们在help.github.com上所做的。” - NiKo
注意:这种“解决方案”并非没有问题。请阅读http://www.w3.org/QA/Tips/reback。 - Denilson Sá Maia

7

手动布局方法

如果您不想使用 https://github.com/jekyll/jekyll-redirect-from,那么自己实现也很容易:

a.md

---
layout: 'redirect'
permalink: /a
redir_to: 'http://example.com'
sitemap: false
---

_layouts/redirect.html 基于 从HTML页面重定向

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Redirecting...</title>
  {% comment %}
    Don't use 'redirect_to' to avoid conflict
    with the page redirection plugin: if that is defined
    it takes over.
  {% endcomment %}
  <link rel="canonical" href="{{ page.redir_to }}"/>
  <meta http-equiv="refresh" content="0;url={{ page.redir_to }}" />
</head>
<body>
  <h1>Redirecting...</h1>
  <a href="{{ page.redir_to }}">Click here if you are not redirected.<a>
  <script>location='{{ page.redir_to }}'</script>
</body>
</html>

现在:

firefox localhost:4000/a

这段文字将会重定向您到example.com网站。

就像这个例子一样,redirect-from插件不会生成301重定向,只使用 + JavaScript进行重定向。

我们可以使用以下方法验证正在进行的操作:

curl localhost:4000/a

本文在 GitHub pages v64 上进行了测试,可以查看以下链接获取实时演示:https://github.com/cirosantilli/cirosantilli.github.io/tree/d783cc70a2e5c4d4dfdb1a36d518d5125071e236/r


1
@给我点踩的人:请解释一下,这样我可以学习并改进信息。我从不报复。 - Ciro Santilli OurBigBook.com
1
这是互联网上最有用和直接的示例。谢谢! - Chrissy LeMaire

7

HTML重定向是一种不错的方式,感谢您的回答,但这不是一种永久的方式。无论如何,我还是给您点赞了。 - user8106148

7
Github Pages不支持类似于.htaccessnginx/conf的任何东西。

https://help.github.com/articles/redirects-on-github-pages/

所以最简单的方法是:

HTML重定向:

index.html

<html>
  <head>
    <meta http-equiv="refresh" content="0; url=http://www.mywebsite.com/" />
  </head>

  <body>
    <p><a href="http://www.mywebsite.com/">Redirect</a></p>
  </body>
</html>

1
当我切换我的github pages网站的域名时,遇到了类似的问题。我在Heroku上设置了 rerouter来处理301重定向到新域名。它非常简单地处理域到域的重定向,但你可能需要修改它来处理你网站的旧域名+路径位置。
我在这里详细描述了步骤:

http://joey.aghion.com/simple-301-redirects/


0
只有在内容类型为html(或类似类型)时,软重定向才起作用。对于二进制文件,比如'foo.pdf',GitHub不会进行重定向,因为它会根据pdf扩展名设置mime类型,软重定向将被解释为损坏的pdf文件。
话虽如此,在GitHub上仍然有可能正确地进行重定向,但只有在满足以下条件时才使用以下解决方案:
  • 服务器不允许您自己设置301重定向(例如GitHub页面)
  • 文件扩展名设置了mime类型,并且是二进制文件(例如pdf、png等)
  • 其他解决方案都不适用于您的情况
  • 用户直接使用浏览器访问资源,而不是通过html引用(例如<img src="...">
  • 旧页面不再被Google等搜索引擎索引(即,站点地图指向新的URL),因为该解决方案会导致Google无法爬取资源(Google只会看到404错误)
  • 您被允许提供自定义的404页面(例如GitHub页面)
关键是在404页面中使用嵌入的JavaScript来检查URL并进行相应的重定向。
GitHub Pages 允许您通过在项目的根目录中创建一个名为 "404.html" 的文件来定义 404 页面(假设整个项目通过分支部署;否则将文件放在部署构件的根目录中)。
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'self'"
    />
    <title>Page not found</title>
    <style type="text/css" media="screen">
      // style your 404 nicely
    </style>
  </head>
  <body onload="redirect()">
    <div class="container">
      <h1>404</h1>
      <p><strong>File not found</strong></p>
      <p>The requested resource does not exist.</p>
      <div id="suggestions">
        <a href="/">Bring me back!</a>
      </div>
    </div>
  </body>
  <script>
    function redirect() {
      if (window.location.pathname === '/old_incorrect_path/foo.pdf') {
        window.location = 'https://yourpage.com/path_to_correct_resource/foo.pdf';
      }
    }
  </script>
</html>

嵌入的JavaScript在404页面加载后检查请求的路径名,并只有在匹配旧地址时才进行重定向。您可以通过链接多个资源来使用这种方式,通过链接多个if语句,或者如果是整个页面的完全重定向,则替换所有URL的位置主机(但在可能的情况下,请使用其他方法)。或者,您也可以将脚本放在顶部并立即执行,而不是等待完全加载,但是,对于用户来说,看到他们的链接确实是404然后将他们发送到正确的位置可能是很好的(这也是一个提醒,一旦人们直接访问正确的链接,您应该删除这个黑客方法)。
请注意,在404页面上设置"Content-Security-Policy"为大部分 'unsafe-inline' 是有意义的,因为您不应该在404页面上加载其他资源。
请在没有其他方法实现所需结果的情况下,不要使用此解决方案。再次强调,此方法仅在用户直接浏览资源时有效。此外,网络爬虫将将这些页面识别为404,因此不会将其视为有效的重定向。例如,谷歌不允许在从谷歌搜索控制台迁移域名时使用此方法(您需要使用301重定向或有效的软重定向通过来使谷歌接受迁移)。此外,通过img等方式引用资源也会中断(因为图像仅被视为404)。
然而,在某些情况下,这是一个有效的解决方案,例如用户直接访问资源而引荐者尚未更新链接(例如过时的谷歌搜索结果链接或其他链接到旧地址的页面)。他们的自动化工具(如果有的话)将通知他们链接返回404,并引导他们更新链接(希望最终能够更新)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接