之前的提到搜索引擎的索引排名的基础就是链接,而实际站点中链接都是指向的URL地址的,URL是明显影响单击率的因素。URL是一个页面的所有内容的地址,除了要对用户友好外(URL地址命名),最关键的就是对搜索引擎友好,因为这是每个页面索引的基础。
一、URL地址插入关键词的好处
1、对搜素引擎排名有好处,在正式的排名中URL地址起到的作用估计占到20%,主要是为了增加单击和一目了然的关联性。
2、鼠标经过链接文字时,URL会出现在浏览器状态栏,可以吸引单击。
3、基于关键词的URL比查询字符串更加容易记忆。
二、静态URL和动态URL
1、静态URL
定义为不包括查询字符串的URL地址。这样指向无参数的php脚本的URL也是静态的。即时是由php脚本生成的静态URL,对搜索引擎也不会有任何问题。
2、动态URL
包括一个用“?”开始的查询字符串,用于传递参数的URL。对于不同的查询字符串会有不同的输出内容,搜索引擎会当成是不同的页面,但其实是同一个php脚本生成的。但是脚本可能对不同的查询字符串输出同样的内容,这就可能导致重复内容的出现。同时,搜索引擎可能会尝试去掉多余参数,这样建立的索引可能有大量重复内容。
三、URL重写
基于Apache服务器的rewrite_module模块进行的的URL重写是非常的强大的一个功能,提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。
1、启用mod_rewrite
需要在Apache的服务器配置文件http.conf中打开
LoadModule rewrite_module modules/mod_rewrite.so
2、重写URL
分为服务器级(http.conf)和目录级(.htaccess)配置方式,两种配置的书写方式都相同。一般情况下优先使用前者,除非没有对主配置文件的访问权限。使用AllowOverride启用了.htaccess文件后,Apache每次都在所有目录中查找.htaccess文件,无论是否真的存在或用到,将会导致性能下降。另外,Apache必须在所有上级目录中查找.htaccess文件,从而使所有的指令都生效。同时,启用.htaccess修改权限后,会更改服务器的配置,从而可能带来意想不到的修改。
- RewriteBase:设置目录级重写的基准URL,作用域是directory、.htaccess。可以用于目录级的配置文件中并在局部范围起作用。只是剥离了本地路径前缀的一部分。如果网站服务器URL不与物理文件路径直接对应就要指定这个选项。重写后不用再重写根目录,将URL地址前的斜杠去掉了。
- RewriteCond:定义重写发生的条件,作用域是全部配置范围有效。在一个RewriteRule生效之前可以有一个或多个RewriteCond指令,仅当满足条件后才会进行后续的匹配。teststring是一个文本字符串,反向引用方法是 “ %N”(1<= N <=9),引用当前符合条件的分组成分。
格式:RewriteCond teststring CondPattern [flag]
teststring首先被计算,然后与CondPattern比较以获得结果。可以在测试前使用感叹号作为前缀“!”,可以实现条件的反转。可以使用的条件测试有:
teststring>CondPattern teststring<CondPattern teststring=CondPattern (使用字典顺序比较,二者都看做纯字符串)
-d (目录):将teststring看做一个路径名测试是否存在这个目录
-f (文件):将teststring看做一个常规文件测试是否存在
-s (非空的常规文件):将teststring看做一个文件名测试是否存在且大小大于0
-l (符号连接):将teststring看做一个是否是存在的一个符号连接文件
-x (可执行):将teststring看做一个路径名测试是否存在这个目录
-F (对子请求存在的文件):测试是否为一个有效的文件,在服务器当前访问控制配置下范围。用一个内部子请求来检测,会降低服务器性能慎用。
-U (对子请求存在的URL):检查是否为一个有效的URL,在服务器当前访问控制配置下范围。用一个内部子请求来检测,会降低服务器性能慎用。
追加标记:
‘nocase|NC’:忽略大小写 ‘ornext|OR’: 或下一条件
- RewriteEngine:打开或关闭运行时的重写引擎。作用域为全局。设置为on或off。
- RewriteLog:设置重写引擎的日志文件名,作用域为服务器和虚拟主机配置。在每个服务器级别的配置中仅出现一次。要关闭重写操作的记录应该使用“RewriteLogLevel 0”,而不应该设置文件名为空。
- RewriteLogLevel:设置重写引擎的日志详细程度,作用域为服务器和虚拟主机。默认为0,表示不记录重写引擎日志。较高的level会是服务器速度急剧下降。大于2的level只能用于调试目的。
- RewriteRule:定义重写规则。作用域为全局。
格式:RewriteRule pattern substitution []flag]
反向引用使用 “$N”(0<=N <=9),对RewriteCond最后匹配的反向引用使用“%N”,对服务器变量的引用使用“%{var}”,对RewriteMap中定义的函数的引用“${mapname:key|default}”。
重写规则按定义顺序依次替换,知道所有规则处理完毕,除非使用L标记终结。
追加标记:
‘chain | C’:链接下一个规则。如果一个规则匹配则继续处理后续规则,如果不匹配,其后继规则将跳过不执行。
‘cookie | CO=NAME:VAL:domain[:lifetime[:path]]’:用于在客户端设置一个cookie。
‘env | E=VAR:VAL’:将环境变量VAR设置为VAL。
‘forbidden | F’:强制禁止当前URL,立即返回一个403的HTTP状态码。
‘gone | G’:强制废弃当前URL,返回一个410的HTTP状态码。
‘handler | H=content-handler’:强制定义目标文件的内容处理器为content-handler。
‘last | L’:立即停止重写操作。
‘next |N’:重新执行重新操作,类似continue,此时再次处理的URL已经不是原始的URL了,而是上一次最后一条规则重写后的URL。要避免死循环。
‘nocase | NC’:pattern中忽略大小写。
‘noescape | NE’:输出中不对URI进行转义
‘nosubreq | NS’:不对内部子请求进行处理
‘proxy | P’:强制为代理请求发送,并立即中断重写处理。
‘passthrough | PT’:移交给下一个处理器。
‘qsappend | QSA’:强制在已有的替换字符串中追加一个查询字符串,而不是简单的替换,需要通过重写规则在请求串中增加信息时使用。
‘redirect | R[=code]’:强制执行一个外部重定向,没有指定code,就产生一个302临时性移动的HTTP响应码。
‘skip | S=num’:强制跳过当前规则之后的num个规则继续执行,可以模拟if-then-else结构。
‘type | T=MIME-TYPE’:强制目标文件的MIME类型为MIME-TYPE。
- RewirteLock:设置RewriteMap同步使用的锁文件名,作用域为服务器配置。
- RewriteMap:定义用于关键字查找的映射函数,在服务器和虚拟主机中配置。
在实际重写的过程中,主要的问题就是RewriteRule的书写了,特别使用的是正则表达式进行,其中对于URL中的不同变量的的分隔符问题需要注意,空格一定要换成分隔符,破折号比下划线作为分隔符更好,因为下划线将多个部分连接起来后算作了同一个字符,不利于URL语义,而破折号则是搜索引擎的分隔符分割语句。
四、重定向
前面说过搜索引擎对同样的重复页面会进行惩罚,不利于搜索引擎,同时对于更换链接的页面也需要使用重定向技术,避免损失之前积累的链接价值。
1、301和302重定向
300:多个选择 301:永久转移 302:临时移动 303:见其他 304:未修改 305:使用代理 307:临时重定向
重定向的串联次数一般不能超过3次,实际应用中只有301和302被用于重定向。
RewriteRule ^foo\.php$ /bar.php [R=301,L]
这条规则将foo.php重定向到bar.php,对于php脚本来说,可以不是用重写规则实现,直接使用header函数,返回一个含有Location的头,当没有明确提供状态码时默认为302临时重定向。
2、多个域名的重定向
当有多个域名过期或重新配置后,需要将来自原来的域名的请求都重定向到新的域名,那么可以这样配置:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
URL的友好是对搜索引擎进行索引排名的一大关键因素,利用好各种重写规则构造好的URL,是非常的重要的一步。