79

我在 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爬虫不会将其识别为重定向。

4

8 回答 8

70

最好的解决方案是同时使用<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

于 2013-10-31T22:10:09.880 回答
23

你试过Jekyll Alias Generator 插件吗?

您将别名 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>

另请参阅有关该主题的博客文章

于 2012-12-03T03:22:23.343 回答
14

重定向插件

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基于从 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
于 2016-04-25T18:33:06.227 回答
9

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

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

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


首先,.htaccessinclude属性中添加_config.yml

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]

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

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

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

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

于 2013-06-26T03:24:53.890 回答
6

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

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

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

于 2012-11-15T07:44:18.627 回答
2

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

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

User-agent: *
Disallow: /programovani/

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

于 2012-04-19T18:24:13.197 回答
1

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

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

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

于 2013-07-16T03:37:06.350 回答
1

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

Jekyll 支持您博客文章的YAML 前端部分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
于 2013-09-25T04:02:22.173 回答