用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 相关文章推荐
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
PHP修改session_id示例代码
Jan 08 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
stripos函数知识点实例分享
Feb 11 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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中namespace及use用法分析
2016/12/06 PHP
一个实用的php验证码类
2017/07/06 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
js 窗口抖动示例
2013/09/04 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python实现文字版扫雷
2020/04/24 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
体育教育专业自荐信范文
2013/12/20 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
护士个人年终总结
2015/02/13 职场文书
信访维稳承诺书
2015/05/04 职场文书
校长新学期寄语2016
2015/12/04 职场文书
四年级数学教学反思
2016/02/16 职场文书
python playwright之元素定位示例详解
2022/07/23 Python