搜索引擎优化高级编程:php版(URL重写(Rewrite)是伪静态设置成功了吗?)
优采云 发布时间: 2022-01-22 23:19搜索引擎优化高级编程:php版(URL重写(Rewrite)是伪静态设置成功了吗?)
URL重写(Rewrite)是拦截传入的Web请求并自动将它们重定向到其他URL的过程。例如,当浏览器向 hostname/list_1 发送请求时,服务器会自动将此请求定向到 . 这种技术通常用于搜索引擎优化 (SEO)。
伪静态也是覆盖的一种实现。例如,如果论坛 URL 是 forum-17-1.html,则实际地址可能是 forum.php?fid=17&page=1,其中第一个数字是论坛 ID,第二个数字是页码. 这样的 URL 看起来比较短,没有很多 & 和 GET 参数。不仅用户喜欢这种友好的网址,搜索引擎也喜欢这种简洁明了的网址。
实现 URL 重写有两种方式:
纯代码实现,通过解析PATH_INFO来实现。
服务器实现,例如使用 Apache 的 mod_rewrite 模块。
下面先介绍使用mod_rewrite重写的方法。例如,将列表页list.php?mode=A重写为伪静态list-A.html,步骤如下(假设项目根目录为E:/dev/www/php/new )。
首先,配置 Apache。在 httpd.conf 中删除下面显示的行前面的 # 以启用重写规则。
#LoadModule rewrite_module modules/mod_rewrite.so
在对应的配置项下设置AllowOverride All。
在 网站E:/dev/www/php/new 目录下新建一个 .htaccess 文件,输入以下内容:
重写引擎开启
重写规则 index.html index.php
重写规则列表-([AZ]+)\.html$ list.php?mode=$1 [NC]
重启阿帕奇。立即访问以查看效果。可以看到访问和指向的是同一个页面,说明伪静态设置成功。
现在逐点解释其原理。
Apache 启用 Rewrite 模块,默认情况下禁用。
设置AllowOverride All的目的是为了让.htaccess文件生效;如果 AllowOverride 设置为 none,则 .htaccess 文件将被完全忽略。
创建一个新的 .htaccess 文件。.htaccess 文件是 Apache 中一个重要的配置文件,其格式为纯文本。它提供了一种更改目录配置的方法,方法是将收录一个或多个指令的文件放在特定的文档目录中,作用于该目录及其所有子目录。
请注意,不允许在 Windows 资源管理器中创建 .htaccess 文件。您可以在命令行窗口中输入“echo>.htaccess”来创建一个新文件。
下面是.htaccess 中每一行代码的解释。
1)开启运行时重写功能,默认关闭:
重写引擎开启
2)创建重写规则将index.php重写为index.html:
重写规则 index.html index.php
显然,这是一个伪静态,而“index.html index.php”是最简单的正则表达式。
3)将原地址list.php?mode=$1改写为list-([AZ]+)\.html$:
RewriteRule list-([AZ]+)\.html$ list.php?mode=$1[NC]
其实上面的代码可以理解为,如果Apache遇到一个匹配正则表达式list-([AZ]+)\.html$的请求,它首先捕获第一个括号中的值(这是紧跟在list- , 一个以.html结尾的字母),然后重定向到真正的请求地址list.php?mode=$1,$1就是正则表达式中的反向引用。这就是重写的语义。括号中的“NC”表示不区分大小写。
如果这个页面有分页怎么办?例如 list.php?mode=A&page=2。为了使 URL 更有意义,将地址重写为 list-A-page-2.html。根据葫芦和瓢,在现有的基础上增加一条规则:
RewriteRule list-([AZ]+)-page-(\d?)\.html$ list.php?mode=$1&page=$2
现在尝试直接访问 list-A-page-2.html。由于 RewriteEngine 已打开,因此此步骤不需要重新启动 Apache。虽然现在可以访问了,但是你不觉得这样写很麻烦吗?
第二条和第三条重写规则都是针对list.php文件的,可以合二为一吗?答案是肯定的。完整的.htaccess文件如下:
重写引擎开启
重写规则 index.html index.php
#RewriteRule list-([AZ]+)\.html$ list.php?mode=$1 [NC] 这一行是注释
RewriteRule list-([AZ]+)(?:-page-)?(\d?)\.html$ list.php?mode=$1&page=$2 [NC]
新的重写规则是最常用的正则表达式,例如用于非捕获匹配的“?:”。只要你了解正则表达式,并用 Apache 手册对其进行补充,掌握 URL 重写就变得轻而易举。
建议Nginx也可以实现静态URL,语法几乎没有区别,都是基于正则表达式。
网站 使用 URL 重写有什么好处?
1)有利于搜索引擎爬取。因为现在大多数搜索引擎更喜欢抓取一些静态页面。现在页面上的大部分数据都是动态显示的。这就需要把动态页面变成静态页面,有利于搜索引擎的爬取。
2)更容易让用户记住。很少有用户关心网站页面地址,但是对于大中型的网站来说,增强可读性是很有必要的。
3)隐藏的实现技术。避免暴露所采用的技术,为攻击增加障碍网站。尤其是上面提到的攻击方式,参数是隐藏的,一定程度上增加了攻击的难度。
重写也帮助我们做很多事情,比如简单的下载处理。比如现在需要提供外部文件下载服务,比如下载php.rar文件。下载前需要做很多额外的工作,比如判断下载权限、服务器分流等,这不是简单的文件链接可以处理的,需要服务器端脚本进行一些复杂的处理。通过URL重写,可以将对php.rar文件的请求重定向到对PHP文件的请求,在这个PHP文件中进行判断,满足所有判断后输出文件。假设当前项目目录为 E:\www\php\download,则对 E:\www\php\download\php.rar 的请求现在应该指向一个 PHP 文件。将以下代码添加到当前目录下的 .htaccess 文件中:
重写引擎开启
RewriteRule (.*\.(rar|zip|chm))$ down.php?file=$1 [NC]
down.php中的代码如下: