php apache 404,Apache开启404自定义面页、PHP输出404错误

作者:elinstudio

发布时间:July 18, 2012

分类:Web服务器

过增加.htaccess:

在httpd.conf中设置对目录开启伪静态。

AllowOverride All

然后在目录里放一个.htaccess(.htaccess),添加:

ErrorDocument 404 /404.html

这个的内容根据你的情况改写 。可是有时候当你用IE浏览的时候会发现,这玩意压根就不跳转,关键的地方就是这个html,如果404.html的小于512字节的话,那么IE会认为这个错误页面不够“友好”,会忽视掉的!

通过修改httpd.conf:

这样做的好处是对于你的网站会更安全些,如果没设置,别人在你的网址后随便输入一个路径,会显示404错误,并且会显示你的服务器版本号,服务器配置一目了然,为了避免这种情况,可以设置错误页面。当出现404错误,即找不到网页时,把访问者导入到一个错误页面。

修改 httpd.conf,找到:

#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

httpd.conf中的这一部分,#ErrorDocument 404 /missing.html 是显示错误页信息的,去掉前面的#,修改为:ErrorDocument 404 /404.html

注意:

1.切记不要将404错误转向到网站主页,否则可能会导致主页在搜索引擎中消失。如果一个 404 页面的内容小于 512b,IE 会认为该 404 页面不够友好,在 IE 下将不会成功返回该 404 错误页面。

2.切记不要使用绝对URL。例如:http://www.soqi.cc/404.html。正常情况返回的是 404 状态码,而使用URL形式则返回的是 200 状态码.

状态码的查看可以安装IE的一个HttpWatch插件进行测试!

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

让用户感到这个错误依然在网站的控制范围内。

让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进行处理。

其次要处理另一种更为常见的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的信箱");

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值