标题：重定向
网页定向
我们在网站建设中，时常会遇到需要网页重定向的情况：
1.网站调整（如改变网页目录结构）；
2.网页被移到一个新地址；
3.网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下，如果不做重定向，则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息，访问流量白白丧失；再者某些注册了多个域名的网站，也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
详细介绍
常用的重定向方式有：301 redirect、 302 redirect 与 meta fresh。
301 redirect
301代表永久性转移(Permanently Moved)，301重定向是网页更改地址后对搜索引擎友好的最好方法，只要不是暂时搬移的情况，都建议使用301来做转址。
302 redirect
302代表暂时性转移(Temporarily Moved )，在前些年，不少Black Hat SEO（黑帽SEO）曾广泛应用这项技术作弊，目前，各大主要搜索引擎均加强了打击力度，象Google前些年对域名之王（Business）以及近来对BMW德国网站的惩罚。即使网站客观上不是spam，也很容易被搜寻引擎容易误判为spam而遭到惩罚。
meta fresh
这在2000年前比较流行，不过现在已很少见。其具体是通过网页中的meta指令，在特定时间后重定向到新的网页，如果延迟的时间太短(约5秒之内)，会被判断为spam。
方法
301 Redirect实现网页重定向
IIS服务器实现301重定向
* 打开internet信息服务管理器，在欲重定向的网页或目录上按右键
* 选择“重定向到URL”
* 在“重定向到”输入框中输入要跳转到的目标网页的URL地址
* 选中“资源的永久重定向”（切记）
* 最后点击“应用”
Apache服务器实现301重定向
相比较来说，Apache实现起来要比IIS简单多了。在Apache中，有个很重要的文件.htaccess，通过对它的设置，可以实现很多强大的功能，301重定向只是其中之一。
Redirect permanent / http://www.bloghuman.com/ (将目录下内容重定向到http://www.bloghuman.com/ )
redirect permanent /index.php http://www.bloghuman.com/index.php?go=category_6(将网页index.php重定向到http://www.bloghuman.com/index.php?go=category_6)
通过合理地配置重定向参数中的正则表达式，可以实现更复杂的匹配。有兴趣的朋友可参考本站Apache手册。
PHP下的301重定向
<?php 
Header( "HTTP/1.1 301 Moved Permanently" ) ;
Header( "Location: http://www.bloghuman.com" );
?>
ASP下的301重定向
<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.bloghuman.com"
%>
ASP .NET下的301重定向
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader ("Location","http://www.bloghuman.com");
}
</script>
ColdFusion下的301重定向
<.cfheader statuscode="301" statustext="Moved permanently">
<.cfheader name="Location" value="http://www.new-url.com"> 
旧域名重定向到新域名
创建一个.htaccess文件，并将下面提供的代码写入文件内，它可以确保旧域名所有的目录或者网页正确的跳转到新域名内。
记住.htaccess文件一定要放在旧网站的根目录下，并且新网站要和旧网站保持相同的目录结构及网页文件
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.domain.com/$1 [R=301,L] 
请将上面的www.domain.com修改成你想要跳转到的域名。
此外，这里建议大家归总旧网站的外部链接，并联系相应的站点修改导入链链的URL，以指向新站点。
注意：.htaccess文件只有在使用安装有Mod Rewrite模块的Apache作为WEB服务器的Linux主机上才能起作用
域名301重定向到www的二级域名
在以前的文章中我反复提及过：www.domain.com是domain.com域下的一个二级域名，并对二级域名和一级目录之间如何选择以及网站结构优化做了一个详细的分析，有兴趣的可以读一下两篇文章，网站结构优化是SEO中最重要。
OK，继续域301跳转到www二级域的实现方式：
创建一个.htaccess文件，并将下面提供的代码写入文件内，它可以确保所有来自对domain.com的请求都转向到对www.domain.com进行请求。记住.htaccess文件一定要放在旧网站的根目录下，并且新网站要和旧网站保持相同的目录结构及网页文件
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc] 
请将上面的domain.com和www.domain.com修改成你想要跳转到的域名。
注意：.htaccess文件只有在使用安装有Mod Rewrite模块的Apache作为WEB服务器的Linux主机上才能起作用
检测工具
配置完成后，一定认真检查一下是否正确。Internet有很多类似的Server Header检查工具，如Check Server Headers Tool - HTTP Status Codes Checker
网站302重定向使用不当导致被GOOGLE惩罚
Business.com是网上最大的商业搜索引擎和分类目录，以专业提供商业信息而享负盛名，包括近19万网页。若以“business”为关键词在Google中进行搜索，该网站名列第一。不过在9月5日，Business.com遇到一件蹊跷之事：它的首页由PR8变成了PR0， 而且Google搜索结果中找不到首页。好在被“蒸发”的只是首页，不过庆幸的是第二天首页又回到了Google的搜索结果，但PR仍旧为0。 
Business.com的问题出在它的重定向命令上。该网站让business.com跳转到www.business.com，这种重定向本该是永久性的。我们知道，301属于永久性重定向，而302则属于临时性重定向，只有当一个网站或网页在24到48小时之内临时移到其它位置的情况下才能使用该命令。但Business.com却错误地使用了“HTTP/1.1302 Object Moved”状态码。
普遍现象
其实网站重定向极为普遍，譬如不满意原来的域名而申请了一个新域名；买下容易被人错拼的域名，防止客户因为拼错URL而找不到网站，等等。可是，很多人却会由于使用了错误的重定向状态码而遭“灭站之灾”，就象Business.com。尽管他们的重定向理由充分合理，然而若使用不当，则可能被Google误认为是利用多个域名指向同一网站，那么你的网站就会被封掉，罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。Business.com就是最好的前车之鉴。只不过大多数使用错误重定向参数的网站没Business.com这么幸运，一个小小的重定向就可能使网站前功尽弃，只能从头来过：重新申请新域名，重新发布新网站，等等。记住：Google绝不会同情任何人即使无心犯下的错误。
运作流程
网站服务器响应网页浏览请求的运作流程
让我们先来了解一下用户/搜索引擎和网站一开始的交互流程。当用户或搜索引擎向一个网站服务器发出网页浏览请求时，该服务器将：
1.通过域名服务器(DNS)将域名转换为网站的IP地址，然后返回给客户
2.打开一个该IP套接口连接
3.记下通过该套接口的一个HTTP数据流
4.从WEB服务器接收一个响应请求的HTTP数据流。该数据流包含状态码，状态码的值由HTTP协议所决定。这里所说的“HTTP数据流”信息也叫“头信息(Header)”。头信息中包括了日期，服务器类型，通常还会有一条“200 OK”信息。如果一切良好，那么网络服务器就会将“200 OK”信息以及请求页面发送出去。如果网站在这时候已经建立了重定向，那么服务器就会在头信息中包含一个“302 Moved Temporarily”或“301 Moved Permanent”之类的响应信息。搜索引擎会根据服务器头信息中的内容作出决定。
注意事项
网站重定向的注意事项
1.若准备将服务器上的文件移到其它地方时，须就以下信息正确地通知搜索引擎的爬行程序：
- 目标地址：这些文件被移向何方 
- 移动属性：暂时移走还是永久性移走
2.对拥有多个域名的网站，专家建议应把那些不想在搜索引擎上推广的域名用301跳转命令来永久性重定向。 
确保网站实施了正确的301重定向
指令实施
对于正确实施301重定向
1.在.htaccess文件中增加301重定向指令
2.适用于使用Unix网络服务器的用户。通过此指令通知搜索引擎的spider你的站点文件不在此地址下。这是较为常用的办法。形如：Redirect 301 / http://www.yourdomain.com/
3.在服务器软件的系统管理员配置区完成301重定向
适用于使用Window网络服务器的用户
4.采用“mod_rewrite”技术
通过该技术进行的改变将在.htaccess文件中体现出来，形如：
Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^yourdomain.com 
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=permanent,L] 
5.绑定/本地DNS(域名别名跳转)
如果具有对本地DNS记录进行编辑修改的权限，则只要添加一个记录就可以解决此问题。
若无此权限，则可要求网站托管服务商对DNS服务器进行相应设置。 
DNS服务器的设置 
若要将aaa.domain.com指向www.domain.com，则只需在DNS服务中应增加一个别名记录，可写成：aaa IN CNAME www.domain.com。
如需配置大量的虚拟域名，则可写成：* IN CNAME www.domain.com.
这样就可将所有未设置的以domain.com结尾的记录全部重定向到www.domain.com上。
6.用ASP/PHP实现301重定向：
代码在上面已经介绍过了
专家看法
资深SEO专家Dan Thies的看法和建议
Dan Thies体会
对于Business.com所遭遇的问题Dan Thies深有体会，因为他也有过类似的遭遇。他的网站上有一个会员跟踪脚本，其中一个会员的站点通过302命令映射到这个跟踪脚本，而这个跟踪脚本又是通过302映射到他的主页。当在Google中用“keyword research”进行搜索，他的主页排名在前十位，然而地址显示的却是那个会员的网址。结果使他哭笑不得：访问者通过Google搜索结果进入他的网站，而他却不得不为这些访问量给那个会员支付报酬! 后来他用robots.txt文件禁止Spiders跟踪访问他的会员跟踪脚本才算解决了问题。 
对于Business.com，Dan Thies认为：“目前Google在302重定向"的处理上还存在一定的问题，但并不表示Google不允许302重定向。Business.com并未遭封或遭到惩罚，它们只是返回了错误的响应。”
Dan Thies建议
如果使用了跟踪URL/脚本，又必须让访问者重定向到某一着陆页，那么一定要在robots.txt文件中禁止Spiders去访问第二个重定向。如果没有对跟踪URL/脚本进行重定向，而只是把另外一个URL上的内容给复制过来，那么应在robots.txt文件中禁止Spiders去访问跟踪URL，以防因内容重复而遭搜索引擎惩罚。
经验之谈
301重定向经验谈
一个多域名站主的经验之谈
“我只有一个网站，主域名是www.domain.com，此外还有诸如domain1.com、domain2.com、domain3.com等共计十几个域名。所有这些次级域名都映射到www.domain.com，而且所有域名对应的是同一个IP地址。由于事实上我只有一个站点，一个站点又只能对应一个.htaccess文件，显然不可能直接修改.htaccess文件来实现重定向。
步骤流程
A.把domain1.com从domain.com上独立出来，让它成为服务器上的一个普通独立网站。
B.为domain1.com创建一个.htaccess文本文件，并在文件中设置重定向代码为：
Redirect permanent / http://www.domain.com/
再将修改后的.htaccess文件上传给domain1.com所在服务器。
这一步也可以在域名控制面板中完成。
C.进入域名控制面板，将所有原来绑定到domain.com上的域名从domain.com上释放，然后重新绑定到doamin1.com。这样一来，这些被绑定的域名使用的都是domain1.com的.htaccess文件，因而也就意味着它们都被永久性重定向到domain.com上了。好了，大功告成! 就这么容易!
百度百科
同义词跳转以往在百度百科中创建或检索人物词条时，通常以人的常用名称或者我  百度百科中搜索“贝克汉姆”的重定向们众所周知的熟悉的名字，比如足球明星贝克汉姆，我们通常都搜索“贝克汉姆”，而不是他的全名“大卫·贝克汉姆”，但在百度百科的同义词规
现在在百度百科中只要搜索“贝克汉姆”，或者点击其他带有“贝克汉姆”的词条链接时将直接跳转至“大卫·贝克汉姆”，同时在词条最上方会注明“已为您跳转到本词条，精确匹配的词条为贝克汉姆。”。
与同义词跳转不同的是，在此点击“贝克汉姆”将进入“贝克汉姆”词条是仍然可以编辑的。人物重定百度百科推出的这种重定向功能特别适用于外国人物词条，比如美国总统奥巴马，搜索或点击“奥巴马”将重定向至“贝拉克·奥巴马”，搜索或点击“施瓦辛格”将重定向至“阿诺德·施瓦辛格”。
不仅如此，皇帝、文学家词条也同样使用了重定向，比如“嬴政”重定向至“秦始皇”，“东坡居士”重定向至“苏轼”，“周树人”重定向至“鲁迅”。
台湾美少女音乐组合S.H.E曾经在百度百科中对于标准名跳转的使用产生过争论，歌迷们认为“S.H.E”为标准词，但“SHE”又有“她”的意思，同时还有同名歌曲，因此两者不能合并为同义词。重定向很好地解决了这个问题，在设置了重定向后只要搜索或点击“SHE”将重定向至“S.H.E”，关于该音乐组合的资料都在“S.H.E”词条中，而原“SHE”词条则精简到相关解释和同名歌曲。
维基百科
在维基百科中也有重定向功能，不过维基百科中的重定向就  维基百科中搜索“USA”的重定向与百度百科中的同义词跳转非常相似了，比如搜索或点击“USA”将重定向至“United States”（即“美国”），同时在文章最上方注明“Redirected from USA”（即“由USA重定向而来”）。
这种类型的重定向在维基百科中非常普遍，只要具备同意关联的文章都设置了重定向。
其它定向
Linux重定向1、 基本概念a、 I/O重定向通常与 FD有关，shell的FD通常为10个，即 0～9； 
b、 常用FD有3个，为0（stdin，标准输入）、1（stdout，标准输出）、2（stderr，标准错误输出），默认与keyboard、monitor、monitor有关； 
c、 用 < 来改变读进的数据信道(stdin)，使之从指定的档案读进； 
d、 用 > 来改变送出的数据信道(stdout, stderr)，使之输出到指定的档案； 
e、 0 是 < 的默认值，因此 < 与 0<是一样的；同理，> 与 1> 是一样的； 
f、 在IO重定向 中，stdout 与 stderr 的管道会先准备好，才会从 stdin 读进资料； 
g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin; 
h、 tee 命令是在不影响原本 I/O 的情况下，将 stdout 复制一份到档案去; 
i、 bash（ksh）执行命令的过程：分析命令－变量求值－命令替代（``和$( )）－重定向－通配符展开－确定路径－执行命令； 
j、 ( ) 将 command group 置于 sub-shell 去执行，也称 nested sub-shell，它有一点非常重要的特性是：继承父shell的Standard input, output, and error plus any other open file descriptors。 
k、 exec 命令：常用来替代当前 shell 并重新启动一个 shell，换句话说，并没有启动子 shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候，也只有在这时，exec 不会覆盖你当前的 shell 环境。2、 基本IOcmd > file 把 stdout 重定向到 file 文件中； 
cmd >> file 把 stdout 重定向到 file 文件中(追加)； 
cmd 1> fiel 把 stdout 重定向到 file 文件中； 
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中； 
cmd 2> file 把 stderr 重定向到 file 文件中； 
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)； 
cmd >> file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中(追加)； 
cmd < file >file2 cmd 命令以 file 文件作为 stdin，以 file2 文件作为 stdout； 
cat <>file 以读写的方式打开 file； 
cmd < file cmd 命令以 file 文件作为 stdin； 
cmd << delimiter Here document，从 stdin 中读入，直至遇到 delimiter 分界符。3、 进阶IO>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出； 
<&n 标准输入复制自文件描述符 n； 
<&- 关闭标准输入（键盘）； 
>&- 关闭标准输出； 
n<&- 表示将 n 号输入关闭； 
n>&- 表示将 n 号输出关闭； 
上述所有形式都可以前导一个数字，此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如： 
... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。 
... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ，但效果通常是合并了两个流。) 
我 们对 2>&1详细说明一下 ：2>&1 也就是 FD2=FD1 ，这里并不是说FD2 的值 等于FD1的值，因为 > 是改变送出的数据信道，也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样，这个改变好像没有什么作用，因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor，一样的！ 但是，当 FD1 是其他文件，甚至是其他 FD 时，这个就具有特殊的用途了。请大家务必理解这一点。 
exec 0exec 1>outfilename # 打开文件outfilename作为stdout。 
exec 2>errfilename # 打开文件 errfilename作为 stderr。 
exec 0<&- # 关闭 FD0。 
exec 1>&- # 关闭 FD1。 
exec 5>&- # 关闭 FD5。