这个解决方案允许您通过.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循环中使用哪个重定向代码。