用php来改写404错误页让你的页面更友好


Posted in PHP onJanuary 24, 2013

404错误,很多人都知道,如果要访问的url不存在的时候就读取显示这个页面.以往在处理404方面我们通常的做法是要麽简单写几行字,而有心人士或许还会对其稍加美化,另外一少部份想投机取巧的?砘锷踔劣?eta标?做延时转向,仅此而已,其实404还可以帮我们做很多事,这就是今天我们要讨论的重点了.

首先我来说明一下我的404究竟都能帮我做哪些事情:
1.他可以告诉我何时来自哪?的用户要访问我哪个URL结果失败了.
2.他能告诉我对方为何要访问这个URL,并帮助我优化网站
3.他能告诉我对方的IP地址
4.他能告诉我此人的居心何在
5.我可以让他把那些不想告诉我的给闭嘴
6.他能把他想要告诉我的用email方式发给我
7.他能帮我做301永久重定向.
8.他能告诉我有人正在试图入侵我的网站或主机

听起来很玄也很炫,好吧,接下来我们就来讨论一下究竟他是怎麽做到的.逐一分析:
1.我们可以用PHP捕捉用户的来源URL和当前的URL,所以第一点我们可以很简单的做到.
2.因为有了来源URL,所以你就能很直观的猜测到用户的意图了,我举个例子,就像我的网站https://3water.com,如果某个用户的来源URL是https://3water.com,而捕捉到他目前的URL是https://3water.com/user.php?id=1这就说明此人在浏览我的网站的时候当点击了某个人的个人资料页时结果找不到这个人的资料从而出错,说明:ID=1的这个可能不存在货已经被删掉了,那麽你就要看一下网站上是否还有这个URL的超链接,如果有的话就要想办法把它给删掉吧!
3.这个功能就比较简单了,只需要用PHP捕捉一下对方的ip即可.然后配合其他网站的IP转物理地址的功能就能知道此人来自哪?了.
4.这个功能很好,很强大.因为我的网站www.7di.net是自己配置的服务器,所以安全方面都要靠自己来处理,而往往有些不入流的?砘锒员鹑说姆?衿鞲行巳?他们会用程序尝试各种方法来进入服务器,而此时你就会发现你在短时间内收到大量的404错误,且来源URL为空,他们要访问的URL都是一些很敏感的URL,此时你需要做的就是打开你的防火??设置,然后乾?Q俐落的封掉这个IP.最近这段时间我就是用此方法封了几十个IP,真是小兵立大功!忘记说了,信息产业部的IP也被我封了,我服务器在台湾你来验证个什么劲,真是的~~!
5.说实话,这个插件刚开始的时候让我非常烦恼,因为托他的福我每天会收到几百封Email,有的是因为用户正常浏览导致的,有的是因为各家搜索引擎来?窦?谌莸贾碌?有些是因为小瘪三们想入侵导致的,总之不厌其烦,后来我稍作改动,把扩展名符合条件或IP符合条件的都加入了验证,只要这些符合条件就不用发送Email了,这样一来清爽多了.
6.这一切都脱离不了PHP即时发送Email的功能,我的做法是修改PHP.INI来实现PHP内部mail函数发送,当然了如果你也可以用其他的方法,例如:安装sendmail或者开发一个mail类来藉助第三方smtp发送皆可.只要你爽就好(具体细节不是今天的讨论范围).
7.既然能够访问到这个页面,说明用户访问的URL是不存在的,所以我们要引导用户能够访问到正确的URL才对,那麽既然是引导用户访问正确的URL或许你会说直接用一个meta标?或一句JS延时就行了何必大费周章301转向呢?因为我不想被搜索引擎认为我是在作弊!回答完毕.
8.这一点我在上边已经阐述过了,基本上对于小瘪三的判断要根据你的经验和对你自己网站的熟悉程度来决定,更有甚者,你要大体?解你的网站都有哪些URL被其他网站给反链了(经验啊,非一朝一夕能一蹴而就的).

该说的,该放的否完了,接下来好戏要上演了,把下边的代码存为404.php,然后apache或nginx之类的把你的404错误页指向过来就行了.

<?PHP 
#设置URL,注意没有后划线/ 
$MyURL = (isSet($_SERVER['HTTP_HOST'])) ? Str_iReplace('http://','',StrToLower(rTrim($_SERVER['HTTP_HOST'],'/'))) : 'www.7di.net'; 
#设置URL,注意没有后划线/ 
$MyDomain = (isSet($_SERVER['HTTP_HOST'])) ? 'http://'.Str_iReplace('http://','',StrToLower(rTrim($_SERVER['HTTP_HOST'],'/'))) : 'https://3water.com'; 
//设定时区.主要用来修正8小时时差 
Date_Default_Timezone_Set('Etc/GMT-8'); 
//输出头部 
Header('Content-type:text/html; charset=utf-8'); 
/** 
发送电邮 
参数: 
收件人,邮件标题(不可有换行符),邮件内容(行与行之间必须用\n分隔,每行不可超过70个字符) 
说明: 
调用PHP内置函式Mail发送电邮 
返回: 
返回布尔值 
用法: 
$IsSend=Fun::Mail2($email,$tit,$msg); 
/**/ 
Function Mail2($to,$tit,$msg) { 
IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){ 
throw new Exception('电邮地址错误!'); 
} 
$tit='=?UTF-8?B?'.Base64_Encode($tit).'?='; 
$msg = str_replace("\n.","\n..",$msg); //Windows如果在一行开头发现一个句号则会被删掉,要避免此问题将单个句号替换成两个句号 
Return Mail($to,$tit,$msg,'From:see7di@gmail.com'."\n".'Content-Type:text/html;charset=utf-8'); 
} 
$msg='<table cellspacing="0" cellpadding="0" border="0"><tr><td style="padding:5px;background-color:#F57900;font-size:13px;border:2px solid #222;color:#222;">'; 
$msg.=(isSet($_SERVER['REMOTE_ADDR'])) ? "<b>来访者IP是:</b><br><a href='http://www.ip138.com/ips138.asp?ip={$_SERVER['REMOTE_ADDR']}&action=2' target='_blank'>{$_SERVER['REMOTE_ADDR']}</a><br>" : ''; 
$msg.="<b>来访时间:</b><br>".date('Y-m-d H:i:s',time()).'<br><br>'; 
$msg.=(isSet($_SERVER['REMOTE_HOST'])) ? "<a href='http://www.ip138.com/ips138.asp?ip={$_SERVER['REMOTE_HOST']}&action=2' target='_blank'>{$_SERVER['REMOTE_HOST']}</a><br><br>" : '<br>'; 
$msg.=(isSet($_SERVER['HTTP_USER_AGENT'])) ? "<b>来访者详细资料:</b><br>{$_SERVER['HTTP_USER_AGENT']}<br><br>" : ''; 
$msg.=(isSet($_SERVER['REQUEST_URI'])) ? "<b>要访问的页面是:</b><br>{$MyDomain}{$_SERVER['REQUEST_URI']}<br><br>" : ''; 
$msg.=(isSet($_SERVER['HTTP_REFERER']) And Trim($_SERVER['HTTP_REFERER'])!='') ? "<b>来源地址是:</b><br>{$_SERVER['HTTP_REFERER']}<br><br>" : ''; 
$msg.='</td></tr></table>'; 
//哪些类型的URL不发Email,如果不屏蔽掉这些的话能烦死我 
$arr=Array('mp3','rm','swf','jpg','gif'); 
//哪些IP不发Email,这些基本都是搜索引擎的蜘蛛 
$arrIP=Array('66.249.77.217','66.249.74.67'); 
//要访问的扩展名 
$needEx=Explode('.',StrToLower(Trim($_SERVER['REQUEST_URI']))); 
$needEx=end($needEx); 
IF(!In_Array($needEx,$arr) And !In_Array(Trim($_SERVER['REMOTE_ADDR']),$arrIP)) { 
Mail2('see7di@gmail.com','来自【'.$MyURL.'】的404错误!',$msg); 
} 
unSet($MyURL,$msg,$needEx,$arr); 
Header('HTTP/1.1 301 Moved Permanently'); 
Header ("Location:{$MyDomain}"); 
Die();

注意:如果你感觉上边代码中所实现的功能还不能满足你的?j望,那麽鼓励你改写他,完善它,加强他,我绝不反对,但请你把你的作品分享给我,谢谢啦~~~~!
PHP 相关文章推荐
把从SQL中取出的数据转化成XMl格式
Oct 09 PHP
php str_pad() 将字符串填充成指定长度的字符串
Feb 23 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
May 26 PHP
PHP 函数学习简单小结
Jul 08 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
PHP网站开发中常用的8个小技巧
Feb 13 PHP
PHP使用Pear发送邮件(Windows环境)
Jan 05 PHP
使用正则去除php代码中的注释方法
Nov 03 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
php对大文件进行读取操作的实现代码
Jan 23 #PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 #PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 #PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 #PHP
PHP关联数组的10个操作技巧
Jan 21 #PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 #PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 #PHP
You might like
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
python多进程操作实例
2014/11/21 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
Eclipse面试题
2014/03/22 面试题
护理专业大学生自我推荐信
2014/01/25 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
行政助理岗位职责
2015/02/10 职场文书
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js