如何设置 Mod_Rewrite
关于 Mod_Rewrite
回想一下你上次访问某个购物网站,寻找需要购买的某件特定商品时的情形。当你最终到达该页面时,URL 很可能如下所示:
gizmo.com/latest_and_greatest/specific_gadgets/exactly_what_youre_looking_for
这并不是因为该网站花时间设置了您购买所需的每个目录,而是因为一个名为 Mod_Rewrite 的便捷模块。Mod_Rewrite 允许您根据需要创建自定义和简化的 URL。实际上,实际 URL 可能看起来更接近于此:
http://www.gizmo.com/gp/itemB004RYVI0Q/ref=as_li_ss_tl?
本教程将介绍如何激活 Mod_Rewrite、创建和使用所需的 .htaccess 页面以及如何设置 URL 重写。
内容
- 如何激活 Mod_Rewrite
- 如何创建和允许使用 .htaccess 文件
- 如何使用重写规则
- 如何使用 Rewrite Cond 指令
- 资源
设置
本教程中的步骤要求用户具有 root 权限。您可以在此处的步骤 3 和 4 中了解如何在 Ubuntu 上进行设置。
此外,您需要在服务器上安装 apache。如果您没有,可以使用以下命令为 Ubuntu 下载它:
sudo apt-get install apache2
第 1 部分——如何激活 Mod_Rewrites
在开始生成实际的 URL 重写之前,我们需要激活控制它们的 apache mod_rewrite 模块。这很简单:
sudo a2enmod rewrite
该命令将激活模块,或者(如果已激活)显示“模块重写已启用”字样
第 2 部分 - 关于 .htaccess 文件:
一旦模块被激活,您就可以通过在您的网站目录中创建一个 .htaccess 文件来设置您的 URL 重写。
.htaccess 文件是一种配置网站详细信息的方法,无需更改服务器配置文件。文件名开头的句点将使文件隐藏在文件夹中。
此外,.htaccess 文件的放置也很重要。该文件中的配置将影响其目录中的所有内容以及其下的目录。
您可以在文本编辑器中创建 .htaccess 文件(确保其仅命名为 .htaccess,没有任何其他扩展名或名称),然后通过 ftp 客户端将其上传到您的网站。
或者,您可以使用此命令,将 example.com 替换为您的站点名称,在终端中创建您的 .htaccess 文件。
sudo nano /var/www/example.com/.htaccess
如何允许.htaccess 文件中的更改:
要允许 .htaccess 文件覆盖标准网站配置,请先打开配置文件。注意:此步骤需要 sudo 权限。
sudo nano /etc/apache2/sites-available/default
进入该文件后,找到以下部分,并将 AllowOverride 行从 None 更改为 All。该部分现在应如下所示:
<Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>
保存并退出该文件后,重新启动 apache。.htacess 文件现在可用于您的所有站点。
sudo service apache2 restart
现在您已完成所有设置,可以重写您网站的 URL 了。
第 3 节 - 如何重写 URL
整个 URL 重写操作都在 .htaccess 文件中进行。
总体而言,所有 URL 重写命令都遵循相同的模式:
RewriteRule Pattern Substitution [OptionalFlags]
以下是每个部分的简短解释:
- RewriteRule:这是您可以写入想要使用的 mod_rewrite 指令名称的部分。
- 模式:本节专门介绍如何使用正则表达式解释请求的 URL。本教程不包含对正则表达式的讨论,但您可以在此处找到有关该主题的有用教程。
- 替代:这是我们想要显示的信息页面的实际 URL。由于 php 参数或长串数字,它可能难以记住或令人困惑。例如 www.cityzoo.com/animals.php?mammals=seals
- 可选标志:标志是重写规则指令末尾的标签,可以更改表达式的行为。一些常见标志包括 [F](禁止 URL)、[NC](强制规则忽略大写)、[R=301] 或 [R=302](控制要使用的重定向代码)、[L](表示这是一系列规则中的最后一条)。
三个 URL 重写示例:
示例 1:转到页面 A,查找页面 B:
这是 URL 重写最基本的示例:网站访问者在浏览器中输入一个 URL,但被重定向到另一个 URL。以下是设置方法。
让我们继续为一个网站创建两个单独的页面 - 比如,一个用于苹果(apples.html),一个用于橙子(oranges.html):
将代码复制到Apple页面中:
<html> <head> <title>Apples</title> </head> <body> <h1>This page is about Apples</h1> </body> </html>
之后,可以制作橙子页面,用适当的水果名称代替所有水果名称。
现在打开.htaccess 文件。
sudo nano /var/www/example.com/.htaccess
将以下 URL 重写命令添加到文件:
RewriteEngine on RewriteRule ^oranges.html$ apples.html
保存并退出。
一切就绪后,请访问以“/oranges.html”结尾的网站 - 显示的所有信息都来自“/apple.html”网站。
现在解释一下:
- ^oranges.html:这指的是页面的开头。插入符号 (^) 表示字符串的开头。换句话说,如果我们想要重写的 URL 的页面以除 oranges 之外的任何内容开头(例如 .navel_oranges.html),则重写规则将无法识别该页面,并且不会重定向到 apples.html。
- $:美元符号表示 URL 的结尾。如果字符串中的最后一个字符后面还有其他内容,则重写规则同样无法识别该网页。
- apples.html:这是浏览器实际引导流量的地方。
示例 2:网站的 URL 中有一个参数。如何使其看起来像子目录。
第一个例子指的是一个只需用另一个网站替换的网站。然而,下面的例子解决了当 URL 中有参数时会出现的常见情况。
查看此网址:
http://example.com/results.php?products=apple
显示得更清楚些:
http://example.com/products/apple
.htaccess 文件中的行如下所示:
RewriteEngine on RewriteRule ^products/([A-Za-z0-9-]+)/?$ results.php?products=$1 [NC]
现在解释一下:
- ^products:为了被捕获和重新路由,URL 必须以 products 开头(请记住,这仅指域名后的文本)。如果以其他任何内容开头,则该规则将不适用,URL 将保持不变。
- ([A-Za-z0-9-]+):括号内的内容指的是可以输入到 URL 中的任何信息。换句话说,URL 将被重写以反映网站访问者在 /products/ 之后输入的任何内容。
- +:加号表示括号内可以是一个或多个字符(而不是单个字符,即字母或数字)。
- /?$:美元符号指出字符串的结尾。问号允许字符串中的最后一个字符为正斜杠(尽管它并不要求如此)。
- results.php?products=$1:$1 表示模式中的字符串应放在哪里。换句话说,它将放入从人们在“([A-Za-z0-9-]+):”部分中写入的任何内容中捕获的信息。该过程完成后,浏览器将显示第二个 URL 中的信息
- [NC]:这是短语末尾的标志,表示该规则应该忽略字符串中所有字符的大小写。
示例 3:该网站的 URL 不方便处理。如何清理它
当 URL 很长且很复杂时,就会出现这种情况。
以下面的 URL 为例:
http://example.com/results.php?products=produce&type=fruit&species=apple
尽管 URL 在传递正确内容方面很有效,但对于消费者来说却不太容易记住。URL 重写可让您将 URL 转换为更简单、更清晰的内容:
http://example.com/produce/fruit/apple
为了实现这一点,我们需要在 .htaccess 文件中添加以下几行(您可以在 .htaccess 文件中添加所需的任意多个部分):
RewriteEngine on RewriteRule ^(meat|produce|dairy)/([^/.]+)/([^/.]+)$ results.php?products=$1&type=$2&species=$3
现在解释一下:
- 首先,^(插入符号)开始表达式。
- (肉类|农产品|乳制品):如果我们想限制可以输入的选项,我们可以指定我们只接受的值:在本例中是杂货种类。如果输入了除这三个关键字之外的任何内容,则不会进行 URL 重写。
- ([^/.]+) 表示除了插入符号后面的字符之外,斜杠之间还可以写任何内容,在本例中为斜杠或句点。
- results.php?products=$1&type=$2&species=$3:括号中的每个值都将被提取出来,然后应用于表达式替换部分的较长 URL。$1 表示第一个括号,$2 表示第二个括号,$3 表示第三个括号。
续第 2 页