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


76

我在github页面上有博客-jekyll

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

我发现共同的最佳实践是像这样创建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。我发现的另一个解决方案是create rake任务,它将生成重定向页面。但是,由于它是html,因此无法发送301head,因此SE搜寻器不会将其识别为重定向。


2
这对我有用
Mike Cole

Answers:


67

最好的办法是同时使用<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页面时,这对我有用help.github.com/articles/redirects-on-github-pages。它看起来像您提到的所有内容。
Mike Cole 2014年

使用的效果是canonical暗示Google将从头开始重新编制页面索引,还是将排名得分转移到新页面?您能否阐明这种方法如何影响页面排名?
尤里(Yuri)2015年

会不会<meta http-equiv="refresh"导致无限重定向循环?那就是我得到的,也许我做错了什么?
Erik Berkun-Drevnig,2015年

3
@ ErikBerkun-Drevnig上面看到的内容添加在“旧”页面上,并且应指向“新”页面。这样,就不会有无限循环。
vossad01

如果有人想知道:这两行应包含在您的代码<head>块中。
stragu

22

您是否尝试过Jekyll Alias Generator插件

您将别名URL放在帖子的YAML前端:

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

当用户访问其中一个别名网址时,它们会通过meta标签刷新重定向到主网址:

<!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 2012年

@tekknolagi也许我不懂GitHub Pages。但是,如果您正在运行jekyll,并且仅将静态网站发布到Github,那么它将可行,因为生成的页面将包含对旧网址的元刷新?
ms-ati 2013年

没错

2
我最终遇到了这样的事情。我通过Rake任务在本地生成重定向页面,并将其作为静态页面推送到Github
MailoSvětel13年

我遵循了这种方法,这非常容易。我遇到了两个问题:1)插件不会跑-我必须设置safe: false_config.yml2)我将不得不创造超过400个别名条目。我没有手工制作这些文件,而是使用Python脚本将其自动化:gist.github.com/smholloway/8726873
smholloway 2014年

11

重定向自插件

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

它受到GitHub的支持,并且变得简单:

_config.yml

gems:
  - jekyll-redirect-from

---
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页面v64上进行了测试。

注意:此版本有一个严重的最新错误,该错误错误地重用了默认布局进行重定向:https : //github.com/jekyll/jekyll-redirect-from/pull/106

手动布局方法

如果您不想使用https://github.com/jekyll/jekyll-redirect-from,可以很容易地自己实现它:

---
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插件仅生成meta+ JavaScript重定向,不会生成301 。

我们可以验证发生了什么:

curl localhost:4000/a

10

该解决方案允许您通过.htaccess使用真正的HTTP重定向-但是,涉及.htaccess的内容在GitHub页面上均不起作用,因为它们不使用Apache。

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

我不喜欢这种<meta>方法,所以我为想要使用Apache的.htaccess文件中提供真实HTTP 301重定向的人提供了一个解决方案,该Apache服务于预先生成的Jekyll网站:


首先,添加.htaccessinclude物业_config.yml

include: [.htaccess]

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

---
---
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]

从那里开始,取决于您_site使用Apache。我通常将完整的Jekyll存储库克隆到非webroot目录中,然后我的虚拟主机是指向该_site文件夹的符号链接:

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

多田 现在,Apache可以从您的虚拟根目录提供_site文件夹,并带有.htaccess支持的重定向,该重定向使用您想要的任何HTTP响应代码!

您甚至可能会非常喜欢,并redirect在每个帖子的开头问题中使用属性来指定要在您的.htaccess循环中使用的重定向代码。


这看起来很棒!但是,如果帖子有多个原始链接(以前的链接现在达到404个),该怎么办?
Sharath kumar

2
生成.htaccess文件时,该解决方案将涉及更复杂的逻辑。例如,您可以将YAML转换original为数组而不是字符串。然后,您需要一个嵌套循环,以便每个original条目都生成一个重定向到的重定向permalink。以此代码为起点,自己进行试验!
克里斯·鲁珀尔

谢谢。我按照您的建议运行了。我在教程中使用了这种方法。
Sharath kumar

2
由于此解决方案不适用于GitHub页面,因此无法解决任何问题。不相关的答案是无限的,那么为什么要发布这个答案呢?
科里·戈德堡

@CoreyGoldberg主要是给像您这样的人一些评论;)
Chris Ruppel

5

最好的选择是通过在_config.yml中设置永久链接格式来匹配您的旧博客,从而完全避免更改网址。

除此之外,最完整的解决方案是生成重定向页面,但不一定值得付出努力。我最终只是使用JavaScript来猜测正确的新网址,从而使404页面更加友好。它对搜索没有任何作用,但是实际用户可以转到他们要查找的页面,并且在其余的代码中没有任何遗产可以支持。

http://tqcblog.com/2012/11/14/custom-404-page-for-a-github-pages-jekyll-blog/


2

由于github不允许301重定向(这并不奇怪),因此,您必须在迁移到新的URL结构(并获得搜索引擎成功)或保持URL的原样之间做出决定。我建议您继续前进。让搜索引擎芯片落在可能的位置。如果有人通过搜索引擎点击了您的旧链接之一,他们将被重定向到新位置。随着时间的流逝,搜索引擎将接管您的更改。

您可以做的事情是创建一个Sitemap,在其中您仅列出新页面,而不列出旧页面。这样可以加快用新URL替换旧URL的速度。此外,如果您所有的旧网址都在“ / programovani”目录中,则还可以使用robots.txt文件告诉以后的抓取,他们应该忽略该目录。例如:

User-agent: *
Disallow: /programovani/

搜索引擎需要一些时间才能赶上这些变化。这不是什么大不了的事情。只要旧的URL仍然存在并将实际人员重定向到活动页面,就可以了。


SE不会困扰我。我从其他站点/论坛的链接获取404。我将刷新时间设为零的假页面将“重定向”用户。我确实在网站站长工具中对其进行了测试,而且看来crawler也对此感到满意。但是我不是;)
MailoSvětel2012年

如果您仍然遇到404错误的问题,请向我发送指向其中一个错误的链接,然后看一下是否可以告诉我发生了什么。
艾伦·史密斯

现在,我通过假页面解决了它。前404版本之一是rooland.cz/programovani/2010/04/git-co-to-je-a-co-s-tim。我通过git.io/UrlZaQ生成它们。该脚本很糟糕,但是它
可以满足

1

正如其他人提到的那样,最好的解决方案是保留工作URL或复制页面并指定规范URL。

由于github页面不支持真正的重定向,因此我选择在Heroku上设置重新路由程序,以将301(永久)重定向从站点的旧域返回到新域。我在这里描述了细节:

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


这会支持更复杂的重定向吗?例如,如果我想将链接重定向example.com/index.htmlexample.comexample.com/some-post/index.html,则使用单个域example.com/some-post/
Erik Berkun-Drevnig 2015年

1

Jekyll在过去的几个月中经历了一些重大更新,因此,当最初发布此问题时,也许这不可能。

Jekyllpermalink在博客文章的YAML开头部分支持属性。您可以指定您希望帖子拥有的URL,Jekyll在生成站点时将使用该URL(而不是文件名)。

---
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,但没有提供任何可能对以前存在的旧永久链接结构进行重定向的方式。
乔尔·格洛维耶

您是指在旧网站上重定向旧页面?这样是第三次移动页面了吗?
安德鲁(Andrew)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.