【问题标题】:What is the best approach for redirection of old pages in Jekyll and GitHub Pages?在 Jekyll 和 GitHub Pages 中重定向旧页面的最佳方法是什么?
【发布时间】:2012-04-28 00:42:38
【问题描述】:

我在 github 页面上有博客 - 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,无法发送301head,所以SE爬虫不会将其识别为重定向。

【问题讨论】:

标签: redirect github jekyll http-status-code-301 github-pages


【解决方案1】:

重定向插件

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

注意:这个版本最近修复了一个严重的错误,错误地重用了重定向的默认布局: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 基于Redirect from an HTML page

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

【讨论】:

    【解决方案2】:

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

    截至 2014 年 5 月 GitHub Pages supports redirects,但根据 jekyll-redirect-from Gem documentation,它们仍然基于 HTTP-REFRESH(使用 &lt;meta&gt; 标签),这需要完整的页面加载才能发生重定向。

    我不喜欢 &lt;meta&gt; 方法,所以我为任何希望使用 Apache 在 .htaccess 文件中提供真正的 HTTP 301 重定向的人提供了一个解决方案,该文件为预先生成的 Jekyll 站点提供服务:


    首先,将.htaccess 添加到_config.yml 中的include 属性

    include: [.htaccess]
    

    接下来,创建一个 .htaccess 文件并确保包含YAML front matter。这些破折号很重要,因为现在 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]
    

    从那里开始,您可以使用 Apache 为 _site 提供服务。我通常将完整的 Jekyll 存储库克隆到非 webroot 目录中,然后我的虚拟主机是 _site 文件夹的符号链接:

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

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

    您甚至可以超级花哨并在每个帖子的前面使用 redirect 属性来指定要在 .htaccess 循环中使用的重定向代码。

    【讨论】:

    • 这看起来很棒!但是,如果一个帖子有多个原始(以前的链接现在达到 404)链接怎么办?
    • 当您生成.htaccess 文件时,该解决方案将涉及更复杂的逻辑。例如,您可以转换 YAML,使 original 是一个数组而不是字符串。然后你需要一个嵌套循环,以便每个original 条目生成一个到permalink 的重定向。以这段代码为起点,亲自试验一下吧!
    • 谢谢。我按照你的建议让它工作了。我已经在教程中使用了这种方法。
    • 由于此解决方案不适用于 GitHub 页面,因此它无法回答任何问题。不相关的答案的数量是无限的,那么为什么要发布这个呢?
    • @CoreyGoldberg 主要是为了给像你这样的人一些评论;)
    【解决方案3】:

    最好的解决方案是同时使用&lt;meta http-equiv="refresh"&lt;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/" />
    

    使用&lt;meta http-equiv="refresh" 会将每个访问者重定向到新帖子。 至于 Google Bot,它将&lt;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

    【讨论】:

    • 迁移到 GitHub 页面时,这对我有用:help.github.com/articles/redirects-on-github-pages。它看起来像你提到的一切。
    • 使用canonical的效果是否意味着Google会从头开始重新索引页面,还是会将排名分数转移到新页面?您能否阐明这种方法如何影响页面排名?
    • &lt;meta http-equiv="refresh" 不会导致无限重定向循环吗?这就是我得到的,也许我做错了什么?
    • @ErikBerkun-Drevnig 上面看到的内容被添加到“旧”页面上,应该指向“新”页面。这样一来,就不应该出现无限循环了。
    • 如果有人想知道:这两行应该包含在您的 &lt;head&gt; 块中。
    【解决方案4】:

    Jekyll 在过去几个月中经历了一些重大更新,所以当这个问题最初发布时,这可能是不可能的......

    Jekyll 在您的博客文章的YAML front-matter section 中支持permalink 属性。您可以指定您希望帖子拥有的 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
    

    【讨论】:

    • permalink 属性只是告诉 jekyll 用什么来生成新的 URL,但没有为之前可能已经存在的旧的永久链接结构提供任何重定向方式。
    • 您的意思是在旧网站上重定向旧页面?这是第三次移动页面了吗?
    【解决方案5】:

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

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

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

    【讨论】:

    • 这会支持更复杂的重定向吗?例如,如果我想将 example.com/index.html 之类的链接重定向到 example.comexample.com/some-post/index.htmlexample.com/some-post/,则使用单个域。
    【解决方案6】:

    你试过Jekyll Alias Generator plugin吗?

    您将别名 url 放在帖子的 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>
    

    另请参阅 this blog post 关于该主题。

    【讨论】:

    • GitHub Pages 不使用插件
    • @tekknolagi 也许我不了解 GitHub Pages。但是,如果您正在运行 jekyll,并且只是将静态站点发布到 Github,那么这将起作用,因为生成的页面将包含旧 url 的元刷新?
    • 没错,但 GitHub 不会运行 Jekyll 和插件,只提供编译后的静态站点
    • 我得到了这样的结果。我通过 Rake 任务在本地生成重定向页面并将它们作为静态页面推送到 Github
    • 我采用了这种方法,而且非常简单。我遇到了两个问题:1) 插件无法运行——我必须在_config.yml 中设置safe: false 2) 我将不得不创建超过 400 个别名条目。我没有手工制作,而是使用 Python 脚本将其自动化:gist.github.com/smholloway/8726873
    【解决方案7】:

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

    除此之外,最完整的解决方案是生成重定向页面,但不一定值得付出努力。我最终只是让我的 404 页面更友好一些,用 javascript 猜测正确的新 url。它对搜索没有任何作用,但实际用户可以访问他们正在寻找的页面,并且在其余代码中没有需要支持的遗留内容。

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

    【讨论】:

      【解决方案8】:

      由于 github 不允许 301 重定向(这不足为奇),您必须在迁移到新的 URL 结构(并接受搜索引擎点击)或保留 URL 原样之间做出决定.我建议你继续前进。让搜索引擎的筹码落在他们可能的地方。如果有人通过搜索引擎点击您的旧链接之一,他们将被重定向到新位置。随着时间的推移,搜索引擎会接收到您的更改。

      您可以做的事情是创建一个Sitemap,您可以在其中只列出您的新页面而不是旧页面。这应该可以加快用新 URL 替换旧 URL。此外,如果您所有的旧 URL 都在您的“/programovani”目录中,您还可以使用 robots.txt file 告诉未来的爬网他们应该忽略该目录。例如:

      User-agent: *
      Disallow: /programovani/
      

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

      【讨论】:

      • SE 不是困扰我的。我通过来自其他网站/论坛的链接获得 404。我制作了零刷新时间的假页面,它将“重定向”用户。我确实在网站管理员工具中对其进行了测试,似乎爬虫也对此感到满意。但我不是;)
      • 如果您仍然遇到 404 错误的问题,请给我一个指向其中一个错误的链接,我会看一下,看看我能不能知道发生了什么。
      • 现在我通过假页面解决了它。前 404 之一是 rooland.cz/programovani/2010/04/git-co-to-je-a-co-s-tim 。我通过这个 git.io/UrlZaQ 生成它们。脚本很糟糕,但它可以满足我的需要
      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 2011-11-02
      • 2018-12-21
      • 2017-12-18
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多