Jekyll和GitHub Pages中旧页面重定向的最佳方法是什么?

79

我在github pages上有一个博客,使用jekyll构建。

解决URL策略迁移的最佳方法是什么?

我发现常见的最佳实践是创建类似于以下的htaccess文件

Redirect 301 /programovani/2010/04/git-co-to-je-a-co-s-tim/ /2010/04/05/git-co-to-je-a-co-s-tim.html

但是它似乎在Github上不起作用。我发现的另一个解决方案是创建rake任务,生成重定向页面。但由于它是HTML,无法发送301头,因此搜索引擎爬虫将无法识别它为重定向。


2
这对我有用:https://help.github.com/articles/redirects-on-github-pages - Mike Cole
8个回答

73
最好的解决方案是同时使用<meta http-equiv="refresh"<link rel="canonical" href=。它非常有效,Google Bot在不丢失排名的情况下重新索引了我的整个网站。此外,用户可以立即重定向到新的帖子。
<meta http-equiv="refresh" content="0; url=http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/">
<link rel="canonical" href="http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/" />

使用<meta http-equiv="refresh"标签将会对每个访客进行重定向到新的文章。至于Google Bot,它把<link rel="canonical" href= 标签视为301重定向,其效果是您的页面被重新索引,这正是您想要的。

我在这里描述了整个从WordPress迁移到Octopress的过程。http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/#redirect-301-on-github-pages


5
迁移到 GitHub Pages 时,我使用了以下方法:https://help.github.com/articles/redirects-on-github-pages。看起来它完成了你提到的所有内容。 - Mike Cole
使用canonical的效果是否意味着Google会从头开始重新索引页面,还是将排名分数转移到新页面?您能澄清这种方法如何影响页面排名吗? - Yuri
“<meta http-equiv="refresh"” 不会导致无限重定向循环吗?这就是我得到的,也许我做错了什么? - Erik Berkun-Drevnig
3
以上内容是添加到“旧”页面上的,应该指向“新”页面。这样做就不会出现无限循环。 - vossad01
如果有人想知道:这两行代码应该包含在你的<head>块中。 - stragu

24

你尝试过Jekyll Alias Generator插件吗?

你可以将别名网址放在文章的YAML前置元数据中:

---
  layout: post
  title: "My Post With Aliases"
  alias: [/first-alias/index.html, /second-alias/index.html]
---

当用户访问其中一个别名URL时,他们会通过元标记刷新被重定向到主URL:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="refresh" content="0;url=/blog/my-post-with-aliases/" />
  </head>
</html>

此外,有关该主题,请参阅此博客文章


3
GitHub Pages 不使用插件。 - tekknolagi
也许我不太理解GitHub Pages。但是,如果你正在运行jekyll,并将静态站点发布到Github上,那么这应该可以工作,因为生成的页面将包括旧URL的meta刷新? - ms-ati
这是正确的,但是GitHub不会使用插件来运行Jekyll,只会提供编译后的静态站点。 - tekknolagi
2
我最终得到了这样的东西。我通过Rake任务在本地生成重定向页面,并将它们作为静态页面推送到Github。 - Mailo Světel
我按照这种方法做,感觉很容易。但是我遇到了两个问题:1)插件无法运行 - 我必须在 _config.yml 中设置 safe: false 2)我需要创建超过400个别名条目。为了不手工制作它们,我使用Python脚本进行了自动化处理:https://gist.github.com/smholloway/8726873 - smholloway

16

redirect-from 插件

https://github.com/jekyll/jekyll-redirect-from#redirect-to

该插件受 GitHub 支持,可使重定向变得更加容易:

_config.yml

gems:
  - jekyll-redirect-from

a.md

---
permalink: /a
redirect_to: 'http://example.com'
---

根据https://help.github.com/articles/redirects-on-github-pages/上所述,现在:
firefox localhost:4000/a

这将会重定向到 example.com

插件会在页面定义了 redirect_to 时接管操作。

已测试通过 GitHub pages v64。

注意:这个版本有一个严重的已经修复的 bug,错误地重用了默认的重定向布局:https://github.com/jekyll/jekyll-redirect-from/pull/106

手动布局方法

如果你不想使用 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>

像这个例子一样,`redirect-from`插件不会生成301重定向,只会使用`meta`标签和JavaScript进行重定向。
我们可以通过以下方式验证正在发生的情况:
curl localhost:4000/a

我使用了“layout: page”而不是提供的HTML,这样在重定向时就不会使网站闪烁。 - Yellown

9

这个解决方案允许您通过.htaccess使用真正的HTTP重定向——但是GitHub页面上涉及.htaccess的任何内容都不会起作用,因为它们不使用Apache。

截至2014年5月,GitHub Pages支持重定向,但根据jekyll-redirect-from Gem文档,它们仍然基于HTTP-REFRESH(使用<meta>标签),这需要在重定向发生之前进行完整的页面加载。

我不喜欢<meta>方法,所以我为那些想要在Apache中使用预生成的Jekyll网站提供真正的HTTP 301重定向的人提供了一个解决方案。


首先,在_config.yml文件的include属性中添加.htaccess

include: [.htaccess]

接下来,创建一个 .htaccess 文件,并确保包含 YAML front matter。这些破折号很重要,因为现在 Jekyll 将使用 Liquid 进行解析,这是 Jekyll 的模板语言:

---
---
DirectoryIndex index.html

RewriteEngine On
RewriteBase /

...

确保需要重定向的帖子具有以下两个属性:

---
permalink: /my-new-path/
original: blog/my/old/path.php
---

现在在 .htaccess 中,只需要添加一个循环:
{% for post in site.categories.post %}
  RewriteRule ^{{ post.original }} {{ post.permalink }} [R=301,L]
{% endfor %}

每次构建网站时,这将动态生成.htaccess文件,并且您配置文件中的include确保.htaccess文件被包含在_site目录中。
RewriteRule ^blog/my/old/path.php /my-new-path/ [R=301,L]

从那里开始,你需要使用Apache来提供 _site。我通常会将完整的Jekyll repo克隆到非Web根目录中,然后我的虚拟主机是指向_site文件夹的符号链接:

ln -s /path/to/my-blog/_site /var/www/vhosts/my-blog.com

太棒了!现在Apache可以从您的虚拟根目录中提供_site文件夹,包括使用任何您想要的HTTP响应代码的.htaccess强制重定向!

您甚至可以非常高级地使用每个文章前面的redirect属性来指定在您的.htaccess循环中使用哪个重定向代码。


这看起来很不错!但是如果一篇文章有多个原始链接(以前的链接现在变成了404),怎么办? - Sharath kumar
2
解决方案将涉及到在生成.htaccess文件时使用更复杂的逻辑。例如,您可以转换YAML,使original变为数组而不是字符串。然后,您需要一个嵌套循环,以便每个original条目都生成到permalink的重定向。以此代码为起点进行实验吧! - Chris Ruppel
谢谢。我按照你的建议让它工作了。我已经在教程中使用了这种方法。 - Sharath kumar
2
由于这个解决方案在GitHub页面上不起作用,它根本没有回答问题。无关答案的数量是无限的,那么为什么要发布这个呢? - Corey Goldberg
@CoreyGoldberg 主要是为了让像你这样的人有东西可以评论 ;) - Chris Ruppel

6
最好的选择是通过在_config.yml中设置永久链接格式来匹配您的旧博客,从而避免URL更改。除此之外,最完整的解决方案是生成重定向页面,但这并不一定值得努力。我最终只是让我的404页面更友好了一些,使用javascript猜测正确的新网址。它对搜索没有任何作用,但实际用户可以找到他们要查找的页面,并且在其余代码中没有需要支持的旧有东西。详情请见:http://tqcblog.com/2012/11/14/custom-404-page-for-a-github-pages-jekyll-blog/

2
由于 Github 不允许 301 重定向(这并不令人惊讶),因此您必须在移动到新的 URL 结构(并承受搜索引擎打击)和保留现有 URL 之间做出决定。我建议您继续进行移动。无论搜索引擎如何,都要让它们落在那里。如果有人通过搜索引擎点击您的旧链接,他们将被重定向到新位置。随着时间的推移,搜索引擎将会接收到您的更改。
您可以采取的一些措施来帮助解决问题是创建一个 网站地图,其中只列出您的新页面而不是旧页面。这应该加快旧 URL 替换为新 URL 的速度。此外,如果您所有的旧 URL 都在 '/programovani' 目录中,您还可以使用 robots.txt 文件 告诉未来的爬虫应该忽略该目录。例如:
User-agent: *
Disallow: /programovani/

搜索引擎需要一点时间来适应这些更改。这并不是什么大问题。只要旧的URL仍然存在,并将实际用户重定向到活动页面,您就不会有问题。

SE不困扰我。我遇到的问题是从其他网站/论坛链接过来的404错误。我制作了零刷新时间的假页面,将会把用户“重定向”。我已经在Webmaster工具中进行了测试,爬虫似乎也很满意,但我本人并不满意。 - Mailo Světel
如果你仍然遇到404错误的问题,请将其中一个链接发送给我,我会查看并尝试找出问题所在。 - Alan W. Smith
现在我通过伪造页面解决了这个问题。其中一个以前的404是http://www.rooland.cz/programovani/2010/04/git-co-to-je-a-co-s-tim/。我通过http://git.io/UrlZaQ生成它们。脚本很糟糕,但它能够满足我的需求。 - Mailo Světel

1

正如其他人所提到的,最好的解决方案是保留工作的URL或复制页面并指定一个canonical URL。

由于github pages不支持真正的重定向,我选择在Heroku上设置rerouter来从我的网站旧域名返回301(永久)重定向到新域名。我在这里描述了详细信息:

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


这个支持更复杂的重定向吗?比如说,如果我想要将单个域名下的链接重定向,例如将 example.com/index.html 重定向到 example.com 或者将 example.com/some-post/index.html 重定向到 example.com/some-post/ - Erik Berkun-Drevnig

1
Jekyll在过去几个月中进行了一些重大更新,因此当最初发布这个问题时可能还没有这个功能... Jekyll支持在博客文章的YAML front-matter section中使用permalink属性。你可以指定想要的URL,Jekyll将使用它(而不是文件名)来生成你的网站。
---
title: My special blog post
permalink: /programovani/2010/04/git-co-to-je-a-co-s-tim
---
My blog post markdown content

1
permalink属性只是告诉Jekyll要生成的新URL,但并不提供任何旧的永久链接结构的重定向。这些旧的链接结构可能在之前已经存在。 - Joel Glovier
你的意思是在旧网站上重定向旧页面吗?就像这个页面已经被移动了三次一样? - Andrew

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