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

我在github网页上有博客 – jekyll

解决url策略迁移的最好方法是什么?

我发现最常见的做法是像这样创buildhtaccess

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合作。 我发现的另一个解决scheme是创buildrake任务,这将生成redirect页面。 但是由于它是一个html,它不能发送301头,所以SE抓取工具不会将其识别为redirect。

最好的解决scheme是使用<meta http-equiv="refresh"<link rel="canonical" href=

它工作得很好,Google Bot把我的整个网站重新编入新的链接,而不会丢失任何职位。 用户也被redirect到新的职位。

 <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"将redirect每个访问者到新的职位。 至于Google Bot,它把<link rel="canonical" href= 301redirect,效果就是让你的页面重新编制索引,这就是你想要的。

我描述了整个过程如何将我的博客从Wordpress移动到Octopress。 http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/#redirect-301-on-github-pages

你有没有试过Jekyll Alias Generator插件 ?

你把这个别名URL放在YAML的前面:

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

当用户访问其中一个别名url时,他们通过元标记刷新被redirect到主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> 

另见这个主题的博客文章 。

这个解决scheme允许你通过.htaccess使用真实的HTTPredirect – 但是,没有任何涉及.htaccess的东西会在GitHub页面上工作,因为它们不使用Apache。

截至2014年5月, GitHub Pages支持redirect ,但根据gem文档中的jekyll-redirect,它们仍然基于HTTP-REFRESH (使用<meta>标签),在发生redirect之前需要全部页面加载。

我不喜欢<meta>方法,所以我提出了一个解决scheme,任何人都希望提供一个.htaccess文件使用Apache服务预生成的Jekyll网站提供真正的HTTP 301redirect:


首先,将.htaccess添加到_config.ymlinclude属性

 include: [.htaccess] 

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

 --- --- DirectoryIndex index.html RewriteEngine On RewriteBase / ... 

确保你的post需要redirect有两个属性,如:

 --- 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 %} 

这会在每次构build站点时dynamic生成.htaccess,并且include在configuration文件中确保.htaccess将其放到_site目录中。

 RewriteRule ^blog/my/old/path.php /my-new-path/ [R=301,L] 

从那里,这取决于你使用Apache服务_site 。 我通常将完整的Jekyll repo克隆到非webroot目录中,然后我的虚拟主机是到_site文件夹的符号链接:

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

田田! 现在,Apache可以从虚拟根目录提供_site文件夹,并使用.htaccess支持的redirect,这些redirect使用您希望的任何HTTP响应代码!

你甚至可以获得超级喜好,并在每个post的前端内容中使用redirect属性来指定在你的.htaccess循环中使用哪个redirect代码。

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

除此之外,最完整的解决scheme是生成redirect页面,但不一定值得付出努力。 我结束了简单地使我的404页面更友好点,用JavaScript来猜测正确的新url。 它不会为search做任何事情,但实际的用户可以访问他们正在寻找的页面,并没有遗留的东西来支持其余的代码。

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

由于github不允许301redirect(这并不奇怪),所以你必须在移动到新的URL结构(以及search引擎命中)或者按照它们的方式离开URL之间做出决定。 我build议你继续前进。 让search引擎芯片落在他们可能的地方。 如果有人通过search引擎击中您的旧链接,他们将被redirect到新的位置。 随着时间的推移,search引擎将会select你的改变。

你可以做的事情是帮助你创build一个站点 ,只列出你的新页面,而不是旧页面。 这应该加快旧url的replace。 此外,如果您的所有旧url都位于“/ programovani”目录中,则还可以使用robots.txt文件告诉未来的抓取,应该忽略该目录。 例如:

 User-agent: * Disallow: /programovani/ 

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

redirect – 从插件 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 

会将您redirect到example.com

只要redirect_to由页面定义,插件就会接pipe。

在GitHub页面上testingv64。

注意 :这个版本有一个严重的最近修复的错误,它错误地重用了默认的redirect布局: 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 --- 

基于HTML页面redirect的 _layouts/redirect.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插件不会生成301s,只有meta + JavaScriptredirect。

我们可以validation是怎么回事:

 curl localhost:4000/a 

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

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

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

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

Jekyll在博客post的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