博客系统迁移好多次了,多少次?详见《[[一场疲惫的主题制作之旅]]》。域名啊、博客文章的层级结构啊,都难免存在差异。这就导致了一个问题,之前在别的网站发布的一些页面链接就成了“死链”。虽然,可以简单地重写向到 404 ,体验却不好,最好是可以重定向到变化后的页面。
周末无聊,简单实现了一下,做个记录。
> 2024-02-29 14:17
新情况 - 关于 博客多个域名使用一级域名(如 example.com
)还是 www 二级域名 (如 www.example.com
)及其使用 HTTP 和 HTTPs 访问的相关问题。详见 [[#域名重写向问题]] 。
如何重定向
之前的链接都是 https://ovirgo.com/xxx-yyy-zzz.html
格式的链接,现在要使之重定向到 https://ovirgo.com/posts/xxx-yyy-zzz
到这样的链接地址。
修改服务器端 Nginx 的相关配置,比如 /etc/nginx/conf.d/xxx.conf
(当前主机为 Ubuntu Server ,其他发型版可能有区别)。
location / {
# ...
if (!-e $request_filename) {
rewrite ((\w*=)*\w*)\.html /posts/$1 last;
break;
}
# ...
}
$1
是什么?就是前面正则表达式的匹配的第一个捕获分组。
当请求资源不存在时,重定向到新的路径。对,就是 rewrite
了。
如果,你还不了解,或是很长时间没有使用正则表达式了,可以阅读一下另一篇博文 – 正则表达式,附一个很不错的 正则表达式测试网站 。
Nginx Rewrite
访问重写 rewrite 是 Nginx HTTP 请求处理过程中的一个重要功能,它是以模块的形式存在于代码中的,其功能是对用户请求的 URI 进行 PCRE 正则重写,然后返回 30X
重定向跳转或按条件执行相关配置。
rewrite 模块内置了类似脚本语言的 set、if、break、return
配置指令,通过这些指令,用户可以在 HTTP 请求处理过程中对 URI 进行更灵活的操作控制。rewrite 模块提供的指令可以分为两类:
- 标准配置指令(只是对指定的操作进行相应的操作控制);
- 脚本指令(可以在 HTTP 指令域内以类似脚本编程的形式进行编写)。
标准配置指令
这里我们只介绍与本次修改相关的配置指令。
名称 | rewrite 指令 |
---|---|
指令 | rewrite |
作用域 | server, location |
指令说明 | 对用户的 URI 用正则表达式的方式进行重写,并跳转到新的 URI |
其语法格式如下:
rewrite regex replacement [flag];
# - regex 是 PCRE 语法格式的正则表达式
# - replacement 是重写 URI 的改写规则
# - flag 是执行该条重写指令后的操作控制符
其中,对于 replacement
来说,当改写规则以 http://、https://
或 $scheme
开头时,Nginx 重写该语句后将停止执行后续任务,并将改写后的 URI 跳转返回客户端。
对于,flag
,作为操作符有如下 4 种:
last
执行完当前重写规则跳转到新的 URI 后继续执行后续操作;break
执行完当前重写规则跳转到新的 URI 后不再执行后续操作,不影响用户浏览器 URI 显示;redirect
返回响应码302
的临时重定向,返回内容是重定向 URI 的内容,但浏览器网址仍为请求时的 URI ;permanent
返回响应状态码301
的永久重定向,返回内容是重写向 URI 的内容,浏览器网址变为重定向的 URI 。
脚本指令
这一块目前没有涉及,用的到的时候再说吧。(但取所需 😂)
……
域名重写向问题
最近在申请新的域名备案的时候,审核过程中遇到了这样一个问题 - 审核人员告诉我之前图案的域名无法访问(一串英文 blabloa……),但是我这里怎么访问都是正常的。直到后面,我恍然大悟,他大概率看到的是下面这个页面。
![[assets/Snipaste_2024-02-29_12-41-45.png|500]]
为什么会出现这个问题呢?
日常我访问站点的时候,都是直接使用一级域名(如 aituyaa.com
),审核人员访问时使用的是二级 www 域名 (如 www.aituyaa.com
) 且他使用的是 http 协议,就出现了上述情况。
静态博客生成的过程中,配置文件中一般也需要提供一个 baseURL
之类的属性值。以 HUGO 为例,如果你设置的为 aituyaa.com
,在最后生成的静态页面中引用地址的域名都是这个,当使用 www.aituyaa.com
访问的时候某些资源就会出现跨域问题。这时候,就需要我们在 Nginx 配置中作一些重定向处理。
强制使用 HTTPs
如果站点申请了 SSL 证书,想要强制使用 HTTPs 访问站点,就需要监听 80 端口,并重定向到 443 。
![[assets/Pasted image 20240229143527.png]]
其中, server_name
后便是你要指向站点服务的域名。
强制将 www 二级域名定向为一级域名
如上面所描述的问题,为了保证站点的正确渲染,我们有时候需要将 www 二级域名重定向为一级域名来访问 。
![[assets/Pasted image 20240229144258.png|370]]
只需要在监听 443 端口的那个 server 中,添加如上的判断。如此,当访问的域名为 www.walkssi.com
之类的二级域名时,就会 重定向到 walkssi.com
一级域名。
FAQ
如果,你要实验重写规则,你可能会遇到和我一样的问题,比如说,当你把 flag
为 permanent
时,你可能重定向了某个 URI,当你实验一次之后,发现后续再修改也不起作用了,咦,困扰。
![[assets/Pasted image 20230525222946.png|500]]
设置了 permanent
,被永久重定向了,你需要先清理浏览器缓存,再进行后续的操作。