如何设置Mod_Rewrite

本教程将介绍Mod_Rewrite,一个apache模块,允许您操纵URL以提供更短或更相关的。本教程将介绍激活Mod_Rewrite,创建和使用所需的.htaccess页面,以及设置UR

关于Mod_Rewrite

想想上次你访问一些购物网站,寻找一个具体的事情你需要买。当您最终到达网页时,网址很可能如下所示:
gizmo.com/latest_and_greatest/specific_gadgets/exactly_what_youre_looking_for
这不是因为这个网站花时间来设置你需要购买的每一个目录,而是因为一个名为Mod_Rewrite的方便的模块。 Mod_Rewrite可让您根据需要制作自定义和简化的网址。实际上,实际的网址可能更接近于:
http://www.gizmo.com/gp/itemB004RYVI0Q/ref=as_li_ss_tl?
本教程将介绍激活Mod_Rewrite,创建和使用所需的.htaccess页面,以及设置URL重写。

内容

  1. 如何激活Mod_Rewrite
  2. 如何创建和允许使用.htaccess文件
  3. 如何使用重写规则
  4. 如何使用重写Cond指令
  5. 资源

建立

本教程中的步骤要求用户具有root权限。你可以看到如何设置了在Ubuntu 这里 ,在第3步和4。 此外,您需要在您的服务器上安装apache。如果你没有它,你可以下载它的Ubuntu使用这个命令:
sudo apt-get install apache2

第1节 - 如何激活Mod_Rewrites

在我们开始生成实际的URL重写之前,我们需要激活控制它们的apache mod_rewrite模块。这很简单:
sudo a2enmod rewrite
该命令激活模块,或者如果已激活,则显示“模块重写已启用”

第2节 - 关于.htaccess文件:

模块激活后,您可以通过在网站目录中创建.htaccess文件来设置网址重写。 .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更改为全部。该部分现在应该如下所示:
 <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
 </Directory>
保存并退出该文件后,重新启动apache。 .htacess文件现在将可用于您的所有网站。
sudo service apache2 restart
现在,您已设置为重写网站的网址。

第3节 - 如何重写URLS

整个URL重写操作发生在.htaccess文件中。 总的来说,所有的URL重写命令遵循相同的模式:
 RewriteRule Pattern Substitution [OptionalFlags]
这里是每个部分的简短说明:
  • RewriteRule:这是您可以在您要使用的mod_rewrite指令的名称中写入的部分。
  • 模式:此部分专用于使用正则表达式解释请求的网址。本教程不包括正则表达式的讨论,但你可以找到关于这个问题的一个有用的教程在这里
  • 替换:这是包含我们要显示的信息的页面的实际网址。它可能很难记住或混淆,因为php参数或长串数字。例如。 www.cityzoo.com/animals.php?mammals=seals
  • 可选标志:标志是重写规则指令末尾的标签,可以更改表达式的行为。一些常见的标志包括[F],使URL禁止,[NC],强制规则忽略大写,[R = 301]或[R = 302],控制要使用的重定向代码,[L]这是一个系列中的最后一条规则。

三个URL重写示例:

示例1:转到第A页,找到第B页: 这是网址重写的最基本的示例:网站的访问者在浏览器中键入一个网址,但被重定向到另一个网址。这里是如何设置它。 让我们继续前进,为一个网站打开两个单独的页面 - 例如,一个用于苹果(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(eg.navel_oranges.html)之外的任何内容开头,它将不被重写规则识别,并且不会重定向到apples.html。
  • $:美元符号指的是URL的结尾。如果字符串中最后一个字符之后还有其他内容,则网页将被重写规则同样无法识别。
  • apples.html:这是浏览器实际引导流量的地方。
示例2:网站在其网址中有一个参数。 如何使它看起来像一个子目录。 第一个例子指的是一个简单地需要用另一个替换的站点。但是,下面的实例解决了当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必须以产品开头(请记住,这只指域名后的文本)。如果它以任何其他方式开始,规则将不适用,并且URL将保持不变。
  • ([A-Za-z0-9 - ] +):括号内的内容是指可以输入到URL中的任何信息。换句话说,URL将被重写以反映/ products /之后网站输入的访问者。
  • +:加号表示括号中的内容可以是一个或多个字符(而不是单个字符,即字母或数字)。
  • /?$:美元符号指出字符串的结尾。问号允许字符串中的最后一个字符为正斜杠(尽管它不需要它)。
  • results.php?products = $ 1:$ 1表示模式中的字符串应该在哪里。换句话说,它将把从任何人在“([A-Za-z0-9 - ] +):”部分写的信息放入。过程完成后,浏览器将显示来自第二个URL的信息
  • [NC]:这是短语末尾的标志,表示规则应忽略字符串中所有字符的情况。
示例3:网站具有难以处理的网址。 如何清理 当URL很长和复杂时,会出现这种情况。 以下面的URL为例:
http://example.com/results.php?products=produce&type=fruit&species=apple
与网址在提供正确的内容一样有效,它对消费者来说不是很难忘记。 URL重写将允许您将URL转换为更简单和更清楚的:
http://example.com/produce/fruit/apple
为了实现这一点,我们需要在.htaccess文件中添加以下行(您可以根据需要在.htaccess文件中添加多个部分):
RewriteEngine on
RewriteRule ^(meat|produce|dairy)/([^/.]+)/([^/.]+)$ results.php?products=$1&type=$2&species=$3
现在解释一下:
  • 首先,^(插入符号)启动表达式。
  • (肉类|农产品|乳制品):如果我们想限制可以输入的选项,我们可以指定我们接受的唯一值:在这种情况下是各种杂货。如果除了这3个关键字中的任何一个被键入,则不会重写URL。
  • ([^ /。] +)表示除了插入符之后的字符之外,在正斜杠之间可以写入任何内容,在本例中为正斜杠或句号。
  • results.php?products = $ 1&type = $ 2&species = $ 3:括号中的每个值都将被提取,然后应用于表达式替换部分中较长的URL。 $ 1表示第一个括号,$ 2,第二个,$ 3,第三个。

续第2页

作者Etel Sverdlov