如何重定向和重写URL
正如我刚刚提到的,有几种方法可以实现重定向。它在Apache Web 服务器(通常表示为运行UNIX 或Linux 的系统上的操作系统)上名为.htacess 的标准文件中可用。使用Redirect 和RedirectMatch 指令可以轻松重定向。您还可以使用名为mod_rewrite 的Apache 组件进行重定向,稍后我们将使用名为rewirerules 的高级指令进行讨论。
有多种方法可以在运行Microsoft IIS 的Web 服务器上进行重定向。如“IIS Redirects-301, 302”中所述,最基本的方式是使用IIS控制台。假设您使用的是ISAPI_Rewrite 等ISAPI 插件,IIS 服务器的用户还可以使用带有说明的文本文件。这种脚本语言具有类似于Apache mod_rewrite 组件的功能。
许多程序员使用其他技术来完成重定向,例如直接在Perl、PHP、ASP 和JavaScript 等编程语言中执行。当以这种形式执行重定向时,程序员必须确保Web 服务器返回的HTTP 状态码为301。您可以使用Firefox 插件Live HTTP Headers、Chrome 扩展程序或基于Web 的服务器标头检测工具检查返回的标头。
另一种进行重定向的方法是在页面级别使用元刷新标记,如下所示:
内容部分中的第一个参数5 指示Web 服务器在将用户重定向到指定页面之前应等待多长时间。发布者可以使用此方法来显示页面以通知用户他们将被重定向到该页面。这是目标页面。
但问题是大多数元新标签都被视为302 重定向。唯一的例外是它将重定向延迟设置为0 秒。您应该放弃告诉用户重定向正在进行的帮助页面,但搜索引擎会将其视为301 重定向(为了安全,最好尽可能使用301 重定向)。用于URL 重写和重定向的Mod_rewrite 和ISAPI_Rewrite
关于这个主题有很多东西要写,本书只介绍了一些。以下描述是简短的,以帮助一些专家,包括网页设计师和网站管理员,了解重写和重定向的工作原理。如果你想跳过这个技术话题,你可以直接阅读第6.11.4节“如何在不循环的情况下重定向主页索引文件”。
Apache 的mod_rewrite 和Microsoft 的IIS 服务器的ISAPI_Rewrite 都提供了一种重写URL 的好方法。我们出于以下原因使用这些工具:
您更改了网站的URL 结构,内容也从一个位置移动到另一个位置。如果您出于某种原因更改了CMS 或网站系统,就会发生这种情况。
我想用对搜索引擎友好的网址替换一些不适合搜索引擎的网址。
如果您使用Apache 作为您的Web 服务器,请在您的.htaccess 文件或Apache 配置文件中放置一个名为rewrite rules 的指令,例如sites_conf 目录中的httpd.conf 或特定于站点的配置文件。同样,如果您使用的是IIS 服务器,请使用ISAPI_Rewrite 等ISAPI 插件并将规则放在httpd.ini 配置文件中。
ISAPI_Rewrite 和mod_rewrite 的规则可能不同,下面的讨论主要集中在mod_rewrite 上。htaccess 文件可以这样开始:
要将重写添加到服务器配置文件,您需要删除第二行,因为只有.htaccess 支持RewriteBase。由于我们这里使用的是RewriteBase,所以我们不必在每条规则的开头都键入^/,只需键入^(正则表达式将在后面介绍)。
此步骤完成后,执行重写规则。您可能需要重新编码get_product.php 脚本而不更改用户浏览器位置栏中的URL。
^ 符号表示域名URL 的开头,$ 符号表示URL 的结尾,[0-9] 表示数字,后面的+ 符号表示该数字出现一次或多次。喜欢/落后?表示斜线符号出现0 次或1 次。 () 符号记住括号中的所有内容。然后您可以使用$1 访问缓存的内容(即第一组中的所有内容)。括号)。当然,如果您的规则包含第二组括号,您可以使用$2 访问第二组括号中的所有内容,依此类推。 [L] 标志存储在服务器进程中,并在匹配规则时指示重写引擎停止执行。否则,将执行所有剩余规则。
[^/] 表示除斜线以外的任何符号。这是因为^ 在方括号中被理解为no。 [QSA] 标志表示您不希望缓存搜索请求字符串(就像您不希望保存跟踪参数一样)。
编写高质量的重写规则需要掌握模式匹配(另一种解释正则表达式威力的方式)这里是最重要的特殊符号及其重写引擎的解释。 *:匹配当前字符0次或n次。 +:匹配当前字符1 次或n 次。当前字符出现0 次或1 次。
: 字符串的开头。 $:字符串结束。 任何符号(例如通配符)。 \:“避免”下一个字符,例如\.表示点是实际字符,而不是通配符。 ^: [] 表示不在括号中。例如,[^/] 表示不是正斜杠。
在正则表达式中很容易出错。导致意外子字符串匹配的一些常见错误是:
.* 用于必须使用.+ 的地方(因为.* 什么都不匹配)。
没有反斜杠来转义您不想代表的特殊符号。这是因为在指定时您引用符号而不是\. (因此default.htm 匹配defaultthtm.默认\.htm 仅匹配default.htm。
省略^ 或$,前提是隐式确定开始或结束(因此default\.htm 匹配mydefault.html 并且^default\.htm$ 仅匹配default.htm)。
使用“贪婪”表达式来匹配所有出现而不是在第一个之后停止。
因此,要修改上述规则,您可以使用以下表达式:
为什么不使用以下内容?
因为只能匹配包含一个目录的URL,而包含多个子目录的URL不能匹配。
您可能认为测试或调试是URL 重写中比较重要的部分,调试时,RewriteLog 和RewriteLogLevel 命令是您最好的伙伴!将RewriteLogLevel 设置为4 或更高,然后查看重写引擎在解释规则时执行的操作。