不幸的是,索引页的概念(index.php,default.aspx等)也将引起另一种重复内容问题。如果向WEB服务器没有提供目录中的文件名,默认情况下服务器就会提供“索引”页面,但是并没有重定向到这个页面。如果同时存在这两个URL地址的链接,无论是从内部还是从其他站点,就会出现问题。因为有两个URL地址用于访问同样的内容,就导致了重复内容。严格地说,没有哪一个URL地址比另一个更正确:更短的URL地址更合人意,往往相比“index.php”而言,我们更愿意使用“/”。
解决方案类似于处理www.example.com与example.com问题。无论何时,当服务器得到的请求是以index.php或index.html结尾的文件路径,就必须使用301重定向到包含它的目录。只要使用一条mod_rewrite规则或用PHP,就可以实现重定向。
使用mod_rewrite时,只需在.htaccess文件中添加以下行:
RewriteCond %{THE_REQUEST} ^GET\ .*/index\.{php|html}\ HTTP
RewriteRule ^(.*)index\.(php|html)$ /$1 [R=301,L]
在进行这些更改后,试着加载http://seophp.example.com/index.php,它将重定向到http://seophp.example.com/。这条规则对子目录也适用,比如从http://www.example.com/Proudcts/index.php重定向到http://www.example.com/Products/。
此外,也可以在PHP代码中处理重定向。在接下来的练习中完成它。
去掉“index.php”
一、在seophp文件夹中添加文件index.php,代码如下:
<?php
require_once 'include/url_redirect.inc.php';
fix_index_url();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
<html>
<head>
<title>SEO Egghead:SEO for Nerds</title>
</head>
<body>
<h1>Welcome to SEO Egghead!</h1>
</body>
</html>
二、在url_redirect.inc.php文件中添加如下代码:
<?php
require_once 'url_factory.inc.php';
function fix_index_url(){
if(preg_match('#(.*)index\.(html|php)$#',$_SERVER['REQUEST_URI'],$captures))
{
header('HTTP/1.1 301 Moved Permanently');
header('Location:'.SITE_DOMAIN.$captures[1]);
}
}
?>
三、加载http://seophp.example.com/index.php,期待它重定向到http://seophp.example.com/
这些代码非常直观。开始创建index.php是非常简单的版本,它仅包含一个标题。然而,这个index.php文件的特别之处在于,在其开始处,它加载了url_redirect.inc.php脚本。这个脚本检查了访问本页面的URL地址是否以"index.php"或“index.html”结尾。
if(preg_match('#(.*)index\.(html|php)$#',$_SERVER['REQUEST_URI'],$captures))
在此使用了正则表达式,来检查URL地址是否以上述文件名结尾。调用了函数preg_match(),并通过在圆括号中放置“.*”,即“(.*)”,来指示将位于文件名之前的全部字符保存起来。这些字符都保存在$captures[1]里,它们将会是想要重定向的位置。
如果存在匹配,那么就可以执行301重定向:
{
header('HTTP/1.1 301 Moved Permanently');
header('Location:'.SITE_DOMAIN.$captures[1]);
}
其他类型的重定向
尽管有其他类型的重定向,比如元刷新和JavaScript重定向,但是通常并不推荐使用它们。垃圾网站曾经滥用它们,正因如此,使用它们几乎总是令人生疑的。建议在延迟不超过10秒时,永远不要使用元刷新。典型的元刷新示例如下:
<meta http-equiv="refresh" content="10;url=http://www.seoegghead.com/">
我们根本不推荐使用基于JavaScript的重定向。如果被发现,它很可能导致某种类型的惩罚。