迁移Hexo博客到GitHub Pages

finisky博客 (https://finisky.azurewebsites.net) 本是搭在Azure App Service (WebApp),基于Hexo的静态页面博客在Azure App Service中使用IIS进行host。现在看起来没有太大必要host在Azure上,遂考虑迁移到GitHub Pages (https://finisky.github.io) 。

迁移方案

迁移本身从技术来讲是很简单的,像Hexo这样静态生成的页面,只需要改一下部署的endpoint即可。具体来说,只需要改下hexo配置_config.yml中deployment部分的repo。难点主要在于SEO,即要告诉搜索引擎“我的站点迁移到了新域名,请继续把流量导过来。” 否则,新网站需要重新积累流量,甚至会被搜索引擎判定为重复内容而降低排名。

对SEO,Google有Search Console,Baidu有百度搜索资源平台,二者也都有对应的域名迁移功能,Google在设置中叫“地址更改”,Baidu叫“网站改版”。实现机制也差不多,在旧页面使用301 Redirect到新地址即可。如果是Apache,修改下.htaccess文件即可,而Azure App Service就要费点劲了。

那么问题就变成了如何在旧站中使用301 Redirect到新页面。有如下几种方案:

  1. JavaScript重定向,需要改Hexo生成页面的代码,插入一段js,指向新地址。
  2. 用Azure Function做一层跳板,重定向到新地址。# Create a web 301 redirect service with Microsoft Azure Functions
  3. IIS Server做301重定向。 # How to: Redirect the default *.azurewebsites.net domain to your custom domain on Azure Web Apps

注意,301 Redirect是Server端完成的。因此,方案1不可行,因为搜索引擎无法通过Http返回码确定网站已重定向。方案2做了尝试,在最后一步绑定域名的时候有些问题,Custom Domain验证不能通过,可能是因为DNS延迟的原因,此外,Azure Function的代码也需要进行些修改,仅替换域名,保留余下的相对路径。最后,发现方案3最为简便有效,开始没有使用方案3是因为调研的时候发现许多地方说App Service无法修改IIS的配置,而301 Redirect需要在IIS中完成。

Azure App Service 301 Redirect

实现起来简单粗暴,直接使用Kudu进入网站目录改文件,新加或修改web.config即可。

进入Kudu的方法如下,从App Service的页面:

Development Tools -> Advanced Tools -> Go
Debug Console -> CMD

Kudu Console

可以在console中用touch创建一个新文件web.config(如无),然后点一下这文件旁边的类似铅笔一样的图标即可在网页中编辑,在对应section添加如下内容(易懂,自行替换老url匹配正则和新url):

<configuration>
  <system.webServer>  
    <rewrite>  
        <rules>  
          <rule name="Redirect rquests to default azure websites domain" stopProcessing="true">
            <match url="(.*)" />  
            <conditions logicalGrouping="MatchAny">
              <add input="{HTTP_HOST}" pattern="^finisky\.azurewebsites\.net$" />
            </conditions>
            <action type="Redirect" url="https://finisky.github.io/{R:0}" />  
          </rule>  
        </rules>  
    </rewrite>  
  </system.webServer>  
</configuration>  

重启App Service,通过curl验证是否Redirect成功:

$ curl -I http://finisky.azurewebsites.net
HTTP/1.1 301 Moved Permanently
Content-Length: 149
Content-Type: text/html; charset=UTF-8
Location: https://finisky.github.io/
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=a4826b40618857f64a18b4900df4449012b28a384e457bfbb86d0db1bd1e27e7;Path=/;HttpOnly;Domain=finisky.azurewebsites.net
Date: Wed, 11 Dec 2019 07:59:30 GMT

Cool! 看到了"HTTP/1.1 301 Moved Permanently"。

之后就可以在Google Search Console和百度搜索资源平台中进行域名迁移设置了,而且需要一段时间的验证,一般来说,新老站建议并存3个月以上时间以使流量稳定。

最后还发现了个潜在坑,GitHub Pages可能是个单行线,只能迁出,不好再迁出了。简单研究了一下文档,它不允许用户修改Server配置,所以看起来无法完成301重定向。但jekyll似乎有一个插件可以支持 (# 301 redirect for site hosted at github?)。