哪一天 哪一天 我有吃有穿有住有钱 不再流浪 流浪

ThinkPad X61在Ubuntu 8.10下没有声音的解决方法

sudo vim /etc/modprobe.d/alsa-base
在最后加上一句
toptions snd-hda-intel model=lenovo

如果你是其他品牌的电脑,可以把lenovo换成对应的品牌试试.

eval(function(p,a,c,k,e,d)系列解密javascript程序

<script>
a=62;
function encode() {
var code = document.getElementById(‘code’).value;
code = code.replace(/[rn]+/g, ”);
code = code.replace(/’/g, "\’");
var tmp = code.match(/b(w+)b/g);
tmp.sort();
var dict = [];
var i, t = ”;
for(var i=0; i<tmp.length; i++) {
if(tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for(i=0; i<len; i++) {
ch = num(i);
code = code.replace(new RegExp(‘\b’+dict[i]+’\b’,'g’), ch);
if(ch == dict[i]) dict[i] = ”;
}
document.getElementById(‘code’).value = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?”:e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!”.replace(/^/,String)){while(c–)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return’\\w+’};c=1};while(c–)if(k[c])p=p.replace(new RegExp(‘\\b’+e(c)+’\\b’,'g’),k[c]);return p}("
+ "’"+code+"’,"+a+","+len+",’"+ dict.join(‘|’)+"’.split(‘|’),0,{}))";
}
function num(c) {
return(c<a?”:num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));
}
function run() {
eval(document.getElementById(‘code’).value);
}
function decode() {
var code = document.getElementById(‘code’).value;
code = code.replace(/^eval/, ”);
document.getElementById(‘code’).value = eval(code);
}
</script>

<textarea id=code cols=80 rows=20>
</textarea><br>
<input type=button onclick=encode() value=编码>
<input type=button onclick=run() value=执行>
<input type=button onclick=decode() value=解码>

国庆厦门游—-10.5 鼓浪屿

10.4号与某年某月末日在2522上认识的一位老乡MM逛了百闻不如一见的世博苑,
也就是原来的世博园.
图片太多就不上传了.
重点是10.5号的鼓浪屿

图1: 厦门轮渡码头,对面就是鼓浪屿

图2: 银行中心

图3: 厦门大学就在海的那边一群建筑里.

图4: 日光岩处鼓浪洞天

图5: 建行大厦与银行中心真像"双子楼"

图6: 远眺郑成功

图7: 郑成功近照

图8: 成功脚下死,做鬼也风流

图9: 谢谢各位. 3Q.

国庆厦门游—-10.3 环岛路

10.2 那天 因为别人数码相机临时需要使用
于是我和阿超跑了半个厦门终于买到了Sony T70
顺便赞一下厦门的永乐生活电器,比国美苏宁要好不少
我的相机就是在那买的,最后一台.

10.3号本来联系好的一干人等均有事,导致只有我和阿超2个跑到环岛路起了会自行车就返回了

图1: 双人座自行车乘客三平

图1: 双人座自行车司机阿超

图3: 蓝天白云大海自行车

图4: 如果是三个人,可以骑3座的自行车(不过这车的最前面的司机估计得是壮汉或者猛女)

图5: 如果人比较多,还有这个车

图6: 如果人特别特别的多,那就坐这车吧

图7: 于拉面管偶遇肥了一圈的绍兵,厦门岛真是个弹丸之地.顺便赞一下厦门的西北拉面,不油不腻有一点腥.我在上海吃了N家,始终就没有这种口味的拉面馆.

图8: 厦门欢畅KTV,国庆时候竟然才98一个大包一个下午,真是便宜啊.在上海,每次同事们一起出去都要抢着来,而这次,最后是没人点歌了.

图9: 厦门明发,可惜始终没什么人气.不像上海,哪里有地铁站,哪里就是人气.看来厦门还是习惯世贸,SM,中山路这些老牌的地方

图10: 又是三人行(左起:我,大头,阿超)

图11: 合影,感谢各位陪同,

国庆厦门游—-10.1 集美大学

图一:集诚楼,曾经的计算机学院根据地,集美大学主楼.

图2:嘉庚图书馆,本人学生时代经常光顾

图3:新建校区主楼–文科大楼,又叫“尚大楼”

图4: 做大学生真是太幸福了

图5: 三人行(左起:丽兵,我,阿超)

图6: 文科大楼

图7:远眺嘉庚图书馆

图8: 尚大楼,尚大集团赞助建设的,虽然名字怪怪的,但人家掏钱了就随人家姓了.还是觉得文科大楼好听.
本人也有幸进去一游,顺便在里面某楼的卫生间留下了"到此一游"的证据.

图9: 换个角度看 "尚大楼"

图9: 换个角度看 "集诚楼"

图10: 嘉庚先生说:"诚以待人,毅以处事"

图11: 想起高三时,集美大学招生简章上正是这一幢南国特色的嘉庚式建筑深深的吸引了我

图12:集大前面的“敬贤公园”

图13: 感谢各位陪同参观

国庆厦门游—-前言

国庆结束已经一段日子了
我的这篇blog算是姗姗来迟了
本来不想写什么
但不记录点什么总觉得遗憾

08年初的时候就答应同学们国庆回厦门玩
半年一晃而过
当初说好一起去的同学们
最后成功到达的就剩我一人

如果不是那位厦大姐姐转让的票
可能我也去不成了

接近24小时候的路程
火车终于在第二天下午5点驶入了集美
望着窗外一幕幕熟悉与陌生的景色
思绪万千
一年前,我乘着2522离开这里
一年后,我乘着k197重游故地
年年岁岁花相似,岁岁年年人不同
这是我最大的感受

看来我是个特别恋旧的人
当别人已经忘记过去展望未来的时候
我还依然恋恋不望那首十年.
也许这是很多刚毕业学生的通病
多愁善感吧

来接我的是曾经508的室花,室草,卫生间总管,扫地总管丽兵
一年没见这小伙子,除了越来越沧桑,真是一点也没变啊-_-!
出了火车站,也见到了一年前还在建设中的世贸
现在已经变得高大威猛了.

再次坐上了厦门的公交
虽然只是3站路
却让我再次感受
厦门的司机还是如此的猛~
我抓着把手竟然都上下左右摇摆不定
还好只是3站路就到了

当进了丽兵寒舍的时候
我彻底感叹
我在上海租一间的房子
在他这里却可以租上一套
而且装修设备什么都好的多

晚上去轮渡吃饭
有幸乘坐了厦门刚上的BRT
虽然和地铁轻轨相差甚远
但毕竟这是厦门的一个进步吧
吃饭的地方是一个观海餐厅
虽然晚上黑乎乎的什么也看不到
但吹着凉爽的海风
那舒服劲—怎一个爽字了得
一年没吃的闽南菜,吃起来还是那么熟悉的感觉.
想起在上海吃的偏甜的菜
在厦门,幸福指数真的很高.

附上几张BRT的图片.

纯真IP数据库格式详解

转自 http://lumaqq.linuxsir.org/article/qqwry_format_detail.html

LumaQQ 开发者文档

纯真IP数据库格式详解


摘要
网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础。不过关于其格式的文档却非常之少,后来终于在网上 找到了一份文档,得以了解其内幕,不过那份文档寥寥数语,也是颇为耐心才读明白。在这里我重写一份,以此做为LumaQQ开发者文档的一部分,我想还是必 要的。本文详细介绍了纯真IP数据库的格式,并且给出了一些Demo以供参考。

Luma, 清华大学
修改日期: 2005/01/14

Note: 在此感谢纯真IP数据库作者金狐和那唯一一份文档的作者。

修改历史:
2005-01-14 修改了原来一些表达不清和错误的地方


自从有了IP数据库这种东西,QQ外挂的显示IP功能也随之而生,本人见识颇窄,是否还有其他应用不得而知,不过,IP数据库确实是个不错的东西。 如今网络上最流行的IP数据库我想应该是纯真版的(说错了也不要扁我),迄今为止其IP记录条数已经接近30000,对于有些IP甚至能精确到楼层,不亦 快哉。2004年4、5月间,正逢LumaQQ破土动工,为了加上这个人人都喜欢,但是好像人人都不知道为什么喜欢的显IP功能,我也采用了纯真版IP数 据库,它的优点是记录多,查询速度快,它只用一个文件QQWry.dat就包含了所有记录,方便嵌入到其他程序中,也方便升级。

基本结构

QQWry.dat文件在结构上分为3块:文件头,记录区,索引区。一般我们要查找IP时,先在索引区查找记录偏移,然后再到记录区读出信息。由于 记录区的记录是不定长的,所以直接在记录区中搜索是不可能的。由于记录数比较多,如果我们遍历索引区也会是有点慢的,一般来说,我们可以用二分查找法搜索 索引区,其速度比遍历索引区快若干数量级。图1是QQWry.dat的文件结构图。

图1. QQWry.dat文件结构

要注意的是,QQWry.dat里面全部采用了little-endian字节序

一. 了解文件头

QQWry.dat的文件头只有8个字节,其结构非常简单,首四个字节是第一条索引的绝对偏移,后四个字节是最后一条索引的绝对偏移。

二. 了解记录区

每条IP记录都由国家和地区名组成,国家地区在这里并不是太确切,因为可能会查出来“清华大学计算机系”之类的,这里清华大学就成了国家名了,所以 这个国家地区名和IP数据库制作的时候有关系。所以记录的格式有点像QName,有一个全局部分和局部部分组成,我们这里还是沿用国家名和地区名的说法。

于是我们想象着一条记录的格式应该是: [IP地址][国家名][地区名],当然,这个没有什么问题,但是这只是最简单的情况。很显然,国家名和地区名可能会有很多的重复,如果每条记录都保存一 个完整的名称拷贝是非常不理想的,所以我们就需要重定向以节省空间。所以为了得到一个国家名或者地区名,我们就有了两个可能:第一就是直接的字符串表示的 国家名,第二就是一个4字节的结构,第一个字节表明了重定向的模式,后面3个字节是国家名或者地区名的实际偏移位置。对于国家名来说,情况还可能更复杂 些,因为这样的重定向最多可能有两次。

那么什么是重定向模式?根据上面所说,一条记录的格式是[IP地址][国家记录][地区记录],如果国家记录是重定向的话,那么地区记录是有可能没有的,于是就有了两种情况,我管他叫做模式1和模式2。我们对这些格式的情况举图说明:

图2. IP记录的最简单形式

图2表示了最简单的IP记录格式,我想没有什么可以解释的

图3. 重定向模式1

图3演示了重定向模式1的情况。我们看到在模式1的情况下,地区记录也跟着国家记录走了,在IP地址之后只剩下了国家记录的4字节,后面3个字节构成了一个指针,指向了实际的国家名,然后又跟着地址名。模式1的标识字节是0×01。

图4. 重定向模式2

图4演示了重定向模式2的情况。我们看到了在模式2的情况下(其标识字节是0×02),地区记录没有跟着国家记录走,因此在国家记录之后4个字节之 后还是有地区记录。我想你已经明白了模式1和模式2的区别,即:模式1的国家记录后面不会再有地区记录,模式2的国家记录后会有地区记录。下面我们来看一 下更复杂的情况。

图5. 混和情况1

图5演示了当国家记录为模式1的时候可能出现的更复杂情况,在这种情况下,重定向指向的位置仍然是个重定向,不过第二次重定向为模式2。大家不用担 心,没有模式3了,这个重定向也最多只有两次,并且如果发生了第二次重定向,则其一定为模式2,而且这种情况只会发生在国家记录上,对于地区记录,模式1 和模式2是一样的,地区记录也不会发生2次重定向。不过,这个图还可以更复杂,如图7:

图6. 混和情况2

图6是模式1下最复杂的混和情况,不过我想应该也很好理解,只不过地区记录也来重定向而已,有一点我要提醒你,如果重定向的地址是0,则表示未知的地区名。

所以我们总结如下:一条IP记录由[IP地址][国家记录][地区记录]组成,对于国家记录,可以有三种表示方式:字符串形式,重定向模式1和重定 向模式2。对于地区记录,可以有两种表示方式:字符串形式和重定向,另外有一条规则:重定向模式1的国家记录后不能跟地区记录。按照这个总结,在这些方式 中合理组合,就构成了IP记录的所有可能情况。

设计的理由

在我们继续去了解索引区的结构之前,我们先来了解一下为何记录区的结构要如此设计。我想你可能想到了答案:字符串重用。没错,在这种结构下,对于一 个国家名和地区名,我只需要保存其一次就可以了。我们举例说明,为了表示方便,我们用小写字母代表IP记录,C表示国家名,A表示地区名:

  1. 有两条记录a(C1, A1), b(C2, A2),如果C1 = C2, A1 = A2,那么我们就可以使用图3显示的结构来实现重用
  2. 有三条记录a(C1, A1), b(C2, A2), c(C3, A3),如果C1 = C2, A2 = A3,现在我们想存储记录b,那么我们可以用图6的结构来实现重用
  3. 有两条记录a(C1, A1), b(C2, A2),如果C1 = C2,现在我们想存储记录b,那么我们可以采用模式2表示C2,用字符串表示A2

你可以举出更多的情况,你也会发现在这种结构下,不同的字符串只需要存储一次。

了解索引区

在"了解文件头"部分,我们说明了文件头实际上是两个指针,分别指向了第一条索引和最后一条索引的绝对偏移。如图8所示:

图8. 文件头指向索引区图示

实在是很简单,不是吗?从文件头你就可以定位到索引区,然后你就可以开始搜索IP了!每条索引长度为7个字节,前4个字节是起始IP地址,后三个字 节就指向了IP记录。这里有些概念需要说明一下,什么是起始IP,那么有没有结束IP? 假设有这么一条记录:166.111.0.0 – 166.111.255.255,那么166.111.0.0就是起始IP,166.111.255.255就是结束IP,结束IP就是IP记录中的那头 4个字节,这下你应该就清楚了吧。于是乎,每条索引配合一条记录,构成了一个IP范围,如果你要查找166.111.138.138所在的位置,你就会发 现166.111.138.138落在了166.111.0.0 – 166.111.255.255 这个范围内,那么你就可以顺着这条索引去读取国家和地区名了。那么我们给出一个最详细的图解吧:

图9. 文件详细结构

现在一切都清楚了是不是?也许还有一点你不清楚,QQWry.dat的版本信息存在哪里呢? 答案是:最后一条IP记录实际上就是版本信息,最后一条记录显示出来就是这样:255.255.255.0 255.255.255.255 纯真网络 2004年6月25日IP数据。OK,到现在你应该全部清楚了。

Demo

下一步:我给出一个读取IP记录的程序片断,此片断摘录自LumaQQ源文件edu.tsinghua.lumaqq.IPSeeker.java,如果你有兴趣,可以下载源代码详细看看。

/**
* 给定一个ip国家地区记录的偏移,返回一个IPLocation结构
* @param offset 国家记录的起始偏移
* @return IPLocation对象
*/
private IPLocation getIPLocation(long offset) {
try {
// 跳过4字节ip
ipFile.seek(offset + 4);
// 读取第一个字节判断是否标志字节
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1) {
// 读取国家偏移
long countryOffset = readLong3();
// 跳转至偏移处
ipFile.seek(countryOffset);
// 再检查一次标志字节,因为这个时候这个地方仍然可能是个重定向
b = ipFile.readByte();
if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
ipFile.seek(countryOffset + 4);
} else
loc.country = readString(countryOffset);
// 读取地区标志
loc.area = readArea(ipFile.getFilePointer());
} else if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
loc.area = readArea(offset + 8);
} else {
loc.country = readString(ipFile.getFilePointer() – 1);
loc.area = readArea(ipFile.getFilePointer());
}
return loc;
} catch (IOException e) {
return null;
}
}

/**
* 从offset偏移开始解析后面的字节,读出一个地区名
* @param offset 地区记录的起始偏移
* @return 地区名字符串
* @throws IOException 地区名字符串
*/
private String readArea(long offset) throws IOException {
ipFile.seek(offset);
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1 || b == REDIRECT_MODE_2) {
long areaOffset = readLong3(offset + 1);
if(areaOffset == 0)
return LumaQQ.getString("unknown.area");
else
return readString(areaOffset);
} else
return readString(offset);
}

/**
* 从offset位置读取3个字节为一个long,因为java为big-endian格式,所以没办法
* 用了这么一个函数来做转换
* @param offset 整数的起始偏移
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}

/**
* 从当前位置读取3个字节转换成long
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3() {
long ret = 0;
try {
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}

/**
* 从offset偏移处读取一个以0结束的字符串
* @param offset 字符串起始偏移
* @return 读取的字符串,出错返回空字符串
*/
private String readString(long offset) {
try {
ipFile.seek(offset);
int i;
for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());
if(i != 0)
return Utils.getString(buf, 0, i, "GBK");
} catch (IOException e) {
log.error(e.getMessage());
}
return "";
}

代码并不复杂,getIPLocation是主要方法,它检查国家记录格式,并针对字符串形式,模式1,模式2采用不同的代码,readArea则相对简单,因为只有字符串和重定向两种情况需要处理。

总结

纯真IP数据库的结构使得查找IP简单迅速,不过你想要编辑它却是比较麻烦的,我想应该需要专门的工具来生成QQWry.dat文件,由于其文件格式的限制,你要直接添加IP记录就不容易了。不过,能查到IP已经很开心了,希望纯真记录越来越多~。

php获取中国IP段范围

去这个地址下载全球ip段   http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst
里面cn是中国ip段范围

新建一个php文件叫cnip.php
<?php
$file = file(‘./country-ipv4.lst’);
$handle = fopen(‘./cnip.txt’, ‘a’);
if($handle) {
    foreach ($file as $key => $val) {
        if (strpos($val, ‘#’) !== 0) {
            $ipLines = explode(‘ ‘, $val);
            if ($ipLines[6] == ‘cn’) {
                fputs($handle, $ipLines[0]. ‘-’. $ipLines[2]. "n");
            }
        }
    }
}
?>
打开cnip.txt 中国的ip段范围就有了,
如果是在window环境下,将 fputs($handle, $ipLines[0]. ‘-’. $ipLines[2]. "n"); 中的"n"改为"rn"即可换行

Apache下设置404错误页面

Apache下设置404错误页面

为Apache Server设置 404错误页面的方法芗虻ィ?恍柙?htaccess 文件中加入如下内容即可:

CODE:
ErrorDocument 404 /404.html
[Copy to clipboard]

在“通过HTTP状态码查看搜索引擎蜘蛛如何爬行你的网站”一文中,我介绍了一些经常涉及到的HTTP状态码及含义,譬如大家经常探讨并且与本文相关的Http状态码:

404:服务器找不到指定的资源,请求的网页不存在(譬如浏览器请求的网页被删除或者移位,但不排除日后该链接有效的可能性);
410:请求的网页不存在(注意:410表示永久性,而404表示临时性);
200:服务器成功返回请求的网页;
301:网址永久性重定向
302:网址临时性重定向

注意:大部分搜索引擎将“404”与“410”状态同等对待,如Google。(参见Matt Cutts的说明)

对HTTP404状态码的理解

HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导 入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache还是IIS,均十分简陋、呆板且对用户不友好,无法 给用户提供必要的信息以获取更多线索,无疑这会造成用户的流失。

因此,很多网站均使用自定义404错误的方式以提供用户体验避免用户流失。一般而言,自定义404页面通用的做法是在页面中放置网站快速导航链接、搜索框以及网站提供的特色服务,这样可以有效的帮助用户访问站点并获取需要的信息。

HTTP404对SEO的影响

自定义404错误页面是提供用户体验的很好的做法,但在应用过程中往往并未注意到对搜索引擎的影响,譬如:错误的服务器端配置导致返回“200”状态码 或自定义404错误页面使用Meta Refresh导致返回“302”状态码。正确设置的自定义404错误页面,不仅应当能够正确地显示,同时,应该返回“404”错误代码,而不是 “200”或“302”。虽然对访问的用户而言,HTTP状态码究竟是“404”还是“200”来说并没有什么区别,但对搜索引擎而言,这则是相当重要 的。

(一)自定义404错误页返回“200”状态码

当搜索引擎蜘蛛在请求某个URL时得到“404”状态回应时,即 知道该URL已经失效,便不再索引该网页,并向数据中心反馈将该URL表示的网页从索引数据库中删除,当然,删除过程有可能需要很长时间;而当搜索引擎得 到“200”状态回应时,则会认为该url是有效的,便会去索引,并会将其收录到索引数据库,这样的结果便是这两个不同的url具有完全相同的内容:自定 义404错误页面的内容,这会导致出现复制网页问题。对搜索引擎而言,特别是Google,不但很难获得信任指数TrustRank,也会大大降低 Google对网站质量的评定。(为什么会出现返回“200”状态码的情况??请参看下面内容“自定义404错误页面的基本原则”)

我一直在使用Google Sitemap,当我们提交XML格式网站地图文件时,Google会验证我们的身份以确保是网站合法的管理者。验证方式有两种:上传指定名称的html 页到网站根目录或者在网页meta区域添加一个标识身份的meta标签。我通常是使用上传html网页的方式,但Google却提示我网站根目录下找不到 这个网页(实际上我已上传,并且通过浏览器可以访问),这是一个很可怕的问题,见图:

(二)自定义404错误页使用Meta Refresh返回“302”状态码

常常看到许多网站的自定义404错误页面采取类似这样的形式:首先显示一段错误信息,然后,通过Meta Refresh将页面跳转到网站首页、网页地图或其他类似页。根据具体实现方式不同,这类404页面可能返回“200”状态码,也可能返回“302”,但 不论哪种,从SEO技术角度看,均不是一种合适的选择。

对“200”状态的情况我们上面已经谈过,那么,当404页面返回“302” 时,搜索引擎会怎么对待呢?从理论上说,对“302”错误,搜索引擎认为该网页是存在的,只不过临时改变了地址,仍然会索引收录该页,这样,同样会出现类 似于“200”状态码时的重复文本问题;其次,以google为代表的主流搜索引擎对302重定向的适用范围要求越来越严格,这类不当使用302重定向的 情况存在很大的风险。

确保自定义404错误页面能够返回“404”状态码

在自定义404错误页面设置完毕后,一定要检查一下其是不是能够正确地返回“404”状态码。可以使用Server Header检查工具,输入一个不存在网页的url,查看一下HTTP Header的返回情况,确信其返回的是“404 Not found”。

404错误的处理方式
(一)定制404错误页面的基本原则

首先应明确的是,404错误应工作在服务器级而不是网页级。对定制使用动态页面如PHP脚本类型的404页时,必须确保在PHP执行前服务器已经顺利地 送出“404”状态码,不然,一旦执行到了ISAPI级别,返回的状态码便只能是“200”或其他如“302”之类的重定向状态码了。

其次,在自定义网站的404错误页面时,对设置的错误页面URL链接应使用相对路径而不是绝对路径,而且自定义404页面应该放在网站根目录下。尽管无 效链接可能是多种形式的URL,但当发生404访问错误时,WEB服务器会自动将其转到自定义的当404错误页中,这跟URL的形似没有关系。

(二)Apache下设置404错误页面

为Apache Server设置 404错误页面的方法很简单,只需在.htaccess 文件中加入如下内容即可:
ErrorDocument 404 /notfound.php

注意:
1.切记不要将404错误转向到网站主页,否则可能会导致主页在搜索引擎中消失
2.切记不要使用绝对URL(例如:http://www.bloghuman.com/nofound.php形式),如果使用绝对URL返回的状态码是“302”+“200”(已测试)

(三)IIS/ASP.net下设置404错误页面

首先,修改应用程序根目录的设置,打开 “web.config” 文件编辑,在其中加入如下内容:

<configuration>
<system.web>
<customErrors mode=”On” defaultRedirect=”error.asp”>
<error statusCode=”404″ redirect=”notfound.asp” />
</customErrors>
</system.web>
</configuration>

注:上文例中“error.asp”为系统默认的404页面,“notfound.asp”为自定义的404页面,使用时请修改相应文件名。

然后,在自定义的404页面“notfound.asp”中加入:

<%
Response.Status = “404 Not Found”
%>

这样,便可以保证IIS能够正确地返回“404”状态码

(四)在IIS/ASP.net下设置404静态页面

设 置静态404错误页面的方法则比较简单,在IIS管理器中右键单击要管理的网站,打开“属性”中的“自定义错误信息”页,为“404”设定相应的错误信息 页即可。不过,此处在“消息类型”中一定要选择“文件”或“默认值”,而不要选择“URL”,不然,将导致返回“200”状态码。

apache常见错误解决方案

转自: http://www.devgg.com/?p=210

多个站点的定义如下

#NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
NameVirtualHost 127.0.0.1:80

<VirtualHost 127.0.0.1:80>
ServerAdmin devgg@devgg.com
DocumentRoot /usr/local/tomcat/webapps/ronglian
ServerName www.ronglian.com
ErrorLog logs/ronglian.com-error_log
CustomLog logs/ronglian.com-access_log common
</VirtualHost>

<VirtualHost 127.0.0.1:80>
ServerAdmin devgg@devgg.com
DocumentRoot /usr/local/wwwroot/chinaface
ServerName www.chinaface.net
ErrorLog logs/chinaface.net-error_log
CustomLog logs/chinaface.net-access_log common
</VirtualHost>

在这里,NameVirtualHost的字段不能省略,否则起apache时报错:

VirtualHost 127.0.0.1.80 overlaps with VirtualHost 127.0.0.1:80, the first has precedence, perhaps you need a NameVirtualHost directive——虽然apache能起,
同错误描述一样,第二个站点的定义被第一个站点的定义所覆盖,即访问第二个站点指向的其实是第一个

NameVirtualHost 字段的端口号不能忽略,否则起apache时报错:
VirtualHost 127.0.0.1:80 — mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results
[error] VirtualHost 127.0.0.1:80 — mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results——apache不能起

如果VirtualHost 字段的端口号确实可用,起apache时报错:
VirtualHost 220.231.32.28:0 — mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results——
但apache可以启动,访问也正常

3 Could not reliably determine the server’s fully qualified domain name

加入ServerName 127.0.0.1即可。

返回顶部