[花果山水帘洞] Gitblog 实现任意 web 路径部署

Gitblog 之前只能部署在 web服务器 上某一站点的根路径下,经过尝试,目前可以部署到任意路径下。

Gitblog 实现任意 web 路径部署

2016-11-16 / vc12345679

Gitblog 之前只能部署在 web服务器 上某一站点的根路径下,经过尝试,目前可以部署到任意路径下。

后续又捉了几次 bug,没什么大问题了,但具体修改没有列在这里,想尝试的朋友请去 我 fork 的分支 上下载,只需自行修改配置文件 rewrite规则 即可。

修改配置文件 {#conf}


我的 branch 里 Nov 19 2016 之后的版本会自动纠错,配置文件无需修改,下面这段请跳过。

注意到 conf.yaml 中提供了首页URL的配置项url,这一点可以进行利用。

为了更加傻瓜,可以修改 app/libraries/Yaml.php 来进行自动配置:

php"url" => str_replace("index.php", "", $_SERVER('PHP_SELF')),

假设 gitblog 部署在 http(s)://siteA/BBB/ 路径下,上面可以得到 "url" => "/BBB/"

注意:请务必删除 conf.yaml 中的 url 配置项,否则自动配置将失效

开启cache后以上手段无效,需手动配置 conf.yaml 中的 url 项,url: /BBB/

修改 theme 目录下的绝对链接 {#theme}


theme 下很多html文件使用了绝对路径,形如 href ="/xxx"src="/xxx"

利用上一步中自动配置的url项,可以把这些绝对链接的第一个/改为 TWIG 形式的 {{ site.url }} 以获得正确的绝对链接。

修正页面上的链接 {#markdown}


这一步是在 app/libraries/Markdown.php 内完成的。

将 blog 的 siteURL 和 tag/category 的 url 以及 yearmonth 的 url 三处绝对链接的第一个/去掉,并改为

trim(base_url(去掉/的原链接, ""), ":")

base_url() 是 CodeIgniter 的 helper url 提供的,可以将相对链接转为略去“index.php”的绝对链接形式; trim() 和 base_url 的第二个参数是为了自适应协议。

整个过程如下

部署地址 = www.siteA.com/BBB/
原链接 = "/blog/xxx.html"
去第一个'/'
oldURL = "blog/xxx.html"
base_url(oldURL, "") = "://www.siteA.com/BBB/blog.html"
trim = "//www.siteA.com/BBB/blog.html"

解析传入的链接


这一步是在 app/controller/Gitblog.php 内完成的。

上一步完成了页面上链接的修改,Gitblog 还需要对新的链接进行解析以适应修改,这里改动不多,但导出部分感觉会出问题,还没有测试,大家吃完螃蟹要是发现问题再报告给我吧。

rewrite 规则的修改 {#rewrite}


差点忘了,任意路径的部署还需要 web 服务器的配合。

以nginx为例,大部分配置与GitBLog文档中的一致 需要改的只是

原配置:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?$1 last ;
        break;
    }
}

新配置:

location /BBB/ {
    if (!-e $request_filename) {
        rewrite ^\/BBB(.*)$ /BBB/index.php?$1 last;
        break;
    }
}

如果有更多级目录的话:

location /BBB/CCC/DDD/EEE/ {
    if (!-e $request_filename) {
        rewrite ^\/BBB/CCC/DDD/EEE(.*)$ /BBB/CCC/DDD/EEE/index.php?$1 last;
        break;
    }
}

大体就是这些了,有问题留言或者在github上开issue吧。