固定链接,在Apache和Nginx上重写URL

在本课中,你将学习一个名为“固定链接”的概念,以及如何在 WordPress 网站中使用它来重写动态 URL。

介绍

在 Web 服务器课程中,你了解到大多数基于 PHP 的应用程序(包括 WordPress)都会有一个目录索引文件。

当用户浏览到相关网站的 URL 时,这个文件就会被执行。

然而,对于由 WordPress 驱动的网站,可以通过同一个目录索引文件渲染多种不同类型的内容,比如文章、页面或产品。

实现这一功能的关键在于一个名为“固定链接”的特性。

查询字符串变量

在深入探讨固定链接之前,了解一个名为“查询字符串”的概念会很有帮助。

让我们看一个测试 WordPress 安装中的例子。

https://wordpress.test/?p=1

在这个例子中,URL 是 https://wordpress.test/,查询字符串是 ?p=1。查询字符串是一种向 Web 服务器传递数据的方式。这里,查询字符串将值 1 传递给了变量 p

在 PHP 中,可以使用超全局变量 $_GET 来访问变量 p 的值。

<?php
$p = $_GET['p'];

然后,PHP 代码可以利用这个值来执行某种数据查找,例如,从数据库中检索 ID 为 1 的文章。

固定链接,也称为“干净 URL”,是一种让 URL 更易于人类阅读的方式。

固定链接不使用查询字符串,而是基于所请求的内容来构建 URL 结构。

以下是上面例子的相同内容,但使用了固定链接。

https://wordpress.test/1/

在这个例子中,URL 是 https://wordpress.test/1/。没有查询字符串,URL 也更易于人类阅读。但 Web 服务器如何知道要提供什么内容呢?

根据预期的 URL 结构,可以配置 Web 服务器来执行 URL 映射,这利用了 Web 服务器的一个特性,称为 URL 重写。Web 服务器可以配置为期望某种 URL 结构,并将这些数据传递给 Web 应用程序,由应用程序根据接收到的数据来处理相关信息的获取。

WordPress 与固定链接

WordPress 有一个名为“固定链接”的功能,它允许你配置 WordPress 网站的 URL 结构。你可以在 WordPress 仪表盘的 设置 > 固定链接 下找到这个功能。

默认的固定链接结构是“朴素”,这意味着没有使用固定链接,而是使用普通的查询字符串。

其他选项允许你从常见选项列表中选择所需的固定链接结构,或者定义你自己的自定义结构。

当你选择除“朴素”之外的任何选项时,服务器将被配置为根据你定义的结构来期望一个干净 URL。同时,WordPress 会将所选结构存储在数据库中。当使用匹配结构的请求访问网站时,WordPress 会利用这两部分数据将 URL 结构映射到需要显示的信息,获取该信息,并将其显示在页面上。

在 Apache Web 服务器上,这通常通过 .htaccess 文件来处理。例如,如果你将固定链接结构设置为除“朴素”之外的任何选项,以下代码将被添加到你的 .htaccess 文件中:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

这会检查 Apache Web 服务器是否启用了重写模块,然后设置重写规则以期望一个干净 URL 结构。

在 Nginx Web 服务器上,这通常通过服务器块配置文件来处理。由于 Nginx 不支持在每个 WordPress 级别使用类似 .htaccess 文件的配置,因此该配置通常默认添加到服务器块的位置指令中。

location / {
            try_files $uri $uri/ /index.php?$args; 
}

每当设置了固定链接结构时,如果你添加指向内部内容(如文章或页面)的链接,WordPress 会根据你设置的固定链接结构自动生成正确的 URL。