由于 typecho 是一个动态网页,每篇文章都 URL 都是形如:https://niekun.net/index.php/archives/192.html

这种包含 php 的动态网站首先不太美观链接比较长,而且在搜索引擎索引时也对动态链接不太友好。所以需要将以上链接形式进行处理,使网页看起来更像静态链接,形如:https://niekun.net/archives/192.html

typecho 设置

进入 typecho 后台管理,点击 设置 - 永久链接
2020-03-03T13:54:41.png

是否启用地址重写功能,选择 启用 然后保存设置,可能会跳出提示框提示未检测到系统支持地址重写,再次选择启用然后保存设置:
2020-03-03T13:55:45.png

设置后系统就会将链接里的 index.php 去掉了,但是这时候如果直接访问文章 URL 的话会出错,因为网站实际链接还是原始的动态链接,下面通过 nginx 的 rewrite 把缺失的 index.php 再给他补回去,这样访问就没问题了。

Nginx rewrite

我使用的反向代理是 Nginx,使用 ngx_http_rewrite_module 进行重定向,可以完成我们期望的效果。

由于我的域名下有除 blog 外其他的网站,所以我将 rewrite 模块放在 location / 下,使重定向不影响其他 location 段。将 location / 段添加如下内容:

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

使用 if 判断当前请求的 URL 下文件/文件夹是否存在,如果不存在则执行 rewrite,!-e 表示不存在文件/文件夹/链接。
rewrite 的过程是:将 $URI 也就是域名后的链接前加上 /index.php,这时候就恢复到原始动态链接了。
last 就是 rewrite 完成后将结果 URL 输出重新进行 location 匹配。

关于 nginx if 语法参考:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if
关于 nginx rewrite 的使用参考:https://niekun.net/archives/195.html

修改完成后测试及重启 nginx:

service nginx configtest
service nginx reload

使用 nginx 的 rewrite 重定向后在浏览器中显示的还是未修改前的静态链接形态,这样就实现了我们的目标了。

标签:if, if statment, regex, 正则

你的评论