自定义404页面(Apache+PHP)

直接把这个写到虚拟主机配置服务器里面去
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

今天做网站的SEO优化,出现了点小问题,问题是这样的,以前网站blog的地址 是:blog.xxx.com/?12345,然而id是12345的用户被删除或者是被屏蔽以后,做的处理是转向一个页面,上面写着“您访问的空间不存 在!”,并没有做跳转或是其他处理,的确是不够友好,而且一些地址被google收录了,对搜索引擎也很不利。其实网站是有统一的404错误页面的,于是 我就想直接header一个404的请求不就完事了吗。

事实并非如此,并没有像我想的那样,apache这家伙真是不听话啊,它竟然真的给了我一个404的错误页,而不是网站是有统一的404错误页面。看了这篇文章才知道原来是这样啊

PS:在header('HTTP/1.1 404 Not Found');这个的时候的确在不同的浏览器下会有空白页的情况,不知道是什么原因,呵呵

以下是该文章,本文转自其他网站。。。(没写哪个网站是因为我看的也是别人转的,也不知道转了几手了)

本文针对Apache + PHP的网站,如果是Win的,思路也差不多。自定义404页面,也就是当用户访问一个不存在的页面时不显示服务器默认的错误页面,而是显示一个事先做好的提示页面,用户浏览器地址栏的网址依然是他输入/访问的网址。这样做至少有两个好处:

  1. 让用户感到这个错误依然在网站的控制范围内,“这是演出的一部分”。
  2. 让webmaster即时知道有这么一个404页面。

先说说产生404的几种可能

  1. User-Agent(浏览器、搜索引擎bots)会访问固定的文件,例如 Maxthon/Firefox浏览器会请求所有被访问网站的 favicon.ico,如果恰巧那个网站没有这个ico文件,它的服务器log就会多出一行404错误提示,同样的还有搜索引擎请求 robots.txt文件。
  2. 用户错误的输入了URL。比如某人先前访问网站的页面/page1.html,然后利用浏览器地址栏的记录功能重新访问,不料错把backspace当成了回车,意识到后又因为手比脑快直接按回车访问了/page1.htm页面(少了个l)。
  3. 某个页面被删除了,而其他网站,如论坛、搜索引擎还在引用这个链接。

对于第一种情况,当然是上传favicon.ico和robots.txt文件到根目录,制作方法和书写规则不再多说。对于第二种情况,所能做的就是和第三种情况进行区分,既只有因第三种情况发生的时候才通知webmaster进行处理。

下面是Apache + PHP制作自定义404页面的方法。

首先处理文件真的不存在的情况,方法是利用Apache的.htaccess定义,网上介绍的文章 很多 ,不再敷述,方法是在.htaccess最开头加上:ErrorDocument 404 /404.php (/404.php是自定义404页面)。

其次要处理另一种更为常见的404,即数据不存在的404。比如这个Blog系统是数据库驱动的,当用户访问某篇文 章时Blog程序会根据ID查询数据 库,如果恰好这个文章被删除,则应该告诉用户该页不存在,同样的情况还适合于论坛删贴后的提示。目前多数Blog和论坛,及其它数据驱动的网站,处理这种 问题的做法是仅显示不存在的提示而不发送404 header,或者干脆转向到/404.php页面(这样浏览器的地址栏就变成了/404.php)。这种做法的缺点是搜索引擎会看到该网站有很多内容相 同(都是不存在的提示文字),URL不同的页面,或者是看到该网站有很多通过302转向到同一个页面的情况,这些都有可能被搜索引擎误以为是SPAM而惩 罚该网站(很多被惩罚的网站始终认为自己是无辜的,其实都是小错积累的结果)。因为已经pass过了服务器层,.htaccess的404定义不再起作 用,所以在读取数据的php文件种针对这种情况应该做以下处理:

<?
$id = $_GET['id']; //这里获得文章、帖子的索引id
//通过 $id 查询数据库
if(如果没有任何结果)
{
     //以前是仅仅显示“该帖子已经不存在”的提示,现在是:
     require('/404.php');
     @header('HTTP/1.1 404 Not Found');
     @header('Status: 404 Not Found');
     exit;
}
?>

这样做可以保证显示404.php的内容,并且发送404 header,并且浏览器地址栏的网址依然是那个用户原始访问的网址。从人类理解的角度往往会把header()语句放在require()上面,但那会 使php停止执行下面的require函数,把header放在最后反而能把404 header发送出来。建议编写论坛、博客和数据驱动网站程序的人都用上面的方法处理数据不存在时的提示信息,避免和搜索引擎产生误会。

最后说说前面提到的通知webmaster的问题,即区分产生404的第二、第三种情况。显然,两种情况的区别是情况二不含有REFERER信息,所以通知webmaster的代码应该是这样的:

<?
...
if($_SERVER['HTTP_REFERER'] != '') //如果有referer,则证明来自某个页面的点击
{
mail(...把404页面 $_SERVER['REQUEST_URI']和referer页面$_SERVER['HTTP_REFERER']通过email寄到webmaster的信箱);
}
?>

这样webmaster在收到email后应即时联系$_SERVER['HTTP_REFERER']网站的 webmaster修改链接。如果$_SERVER['HTTP_REFERER']是搜索引擎,则因为自定义404页面发送了404 header,搜索引擎会在下次更新索引的时候删除这个页面。如果实在不放心,可以在/404.php页面的头部加上meta tag拒绝所有bot:

<meta content="NOINDEX, NOFOLLOW" name="ROBOTS" />

这样就万无一失了。

你可能感兴趣的:(apache,PHP,搜索引擎,浏览器,firefox)