wordpress-固定链接设置-兼谈web服务器重写规则

最近迁移wordprss,从阿里云迁移至本地,搭建测试环境方便调试。遇到点击文章查看内容失败问题,其提示【 Not Found The requested URL was not found on this server.】错误。排查错误过程中,发现跟【固定链接】、【web服务器重写规则】相关,由于不太了解其机制,为此着实折腾了一番,特此笔记备忘。

♦  为什么需要设置固定链接

◆ 动态 URL 与固定链接

动态URL工作方式,是wordpress默认方式访问文章。如本文章动态url为【 https://www.chenzhuzhen.cn/?p=1165 】,web服务器接受请求后,解析 URL 路径,发现【没有】指定文件名(即路径为空),则会加载【默认】的index.php文件,wordpress解析【?p=123】查询参数, 即请求 ID 为 123 的文章。

但这样的链接对用户来说可读性差,对seo也不太友好。所以就会有【固定链接】方式,即把动态 URL 转换为更具可读性的形式。如本文章固定连接为【https://www.chenzhuzhen.cn/技术笔记/wordpress-固定链接设置-兼谈web服务器重写规则/ 】。

◆ wordpress配置固定链接

wordpress可以在后台【设置】->【固定链接】打开【固定链接设置页面】,里面有各种固定链接选项,如下图。其中【朴素】即动态URL,剩余选项都是固定链接。

♦  web服务器重写规则

◆ 固定链接实现机制

就像这个固定链接【 https://www.chenzhuzhen.cn/技术笔记/wordpress-固定链接设置-兼谈web服务器重写规则/ 】。用户方便了理解,但是web服务器可理解不了,因此需要通过 .htaccess 中(本人用的是apache)的【重写规则】将其重定向到 index.php,再由 WordPress 自己解析路径并匹配内容。换句话说,wordpress的重写功能依赖于web服务器的【重写规则】功能,如apache涉及的重写规则的功能有:【mod_rewrite 模块】、【AllowOverride 设置】、【.htaccess 文件】。

◆ 案例:重写规则匹配过程

以下代码是.htaccess文件的重写规则

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

以固定链接【 https://www.chenzhuzhen.cn/技术笔记/wordpress-固定链接设置-兼谈web服务器重写规则/ 】为例,匹配规则过程如下:

RewriteRule ^index.php$ – [L]:实际请求的是 【 https://www.chenzhuzhen.cn/技术笔记/wordpress-固定链接设置-兼谈web服务器重写规则/ 】,不是【 index.php】,所以该规则不匹配,继续检查后续规则。

RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d:显然在网站根目录下并没有 【技术笔记/wordpress-固定链接设置-兼谈web服务器重写规则/ 】这样的文件或目录,所以这两个条件都满足,继续执行下一条规则。

RewriteRule . /index.php [L]:符合【.】意思 是【匹配任意字符】。且将该请求重定向到 index.php,也就是把请求变成了 http://localhost/index.php。所以传来传去,其固定链接最终还是被引导至默认文件【index.php】有wordpress内部处理请求。

服务器将请求传递给【 index.php 】文件后,WordPress 开始接管处理。通过其内部的路由系统进行解析。它会识别出 【技术笔记】是文章类别,【wordpress-固定链接设置-兼谈web服务器重写规则】是文章的名称。WordPress 就会会在数据库中查找符合这些条件的文章,然后将提取到的文章内容进行渲染,生成 HTML 页面。接着服务器将生成的 HTML 页面返回给用户的浏览器,用户就能在浏览器中看到文章的内容了。