当不能控制服务器且不支持自定义.htaccess或http.ini文件,或者需要根据动态的条件进行跳转,可以用动态程序实现301,不管 jsp asp php 程序原理都是一样的,即设置头部状态码和要跳转目标URL,发送头部就行了。

.htaccess 301 跳转代码

Redirect 301 / http://shuai.be

nginx 301 跳转代码

server {
server_name domain.com;
rewrite ^/(.*)$ http://redirect.com permanent;
}

ASP、ASP.net 301 跳转代码

Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "URL"

PHP 301 跳转代码

header("HTTP/1.1 301 Moved Permanently");
header("Location: URL");
exit(); //注意:虽然客户端转向了,但程序还会向下执行,所以要exit

JSP 301 跳转代码

response.setStatus(301);
response.setHeader("Location","URL");

多个域名绑一个站怎么做301:如a.com,a.net,www.b.net和www.a.com都是绑在一个站,为了网址规范化都要跳转到www.a.com这个主域名上,这时不能光写上面的代码,否则就成循环跳转了,要进行条件判断,即对主机头不是www.a.com才转向,以ASP为例:

IF Request.Url.Host<>"www.a.com" THEN 
string newurl="http://www.a.com" & Request.Url.PathAndQuery
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", newurl
END IF 

当然这种方法很麻烦,要在每个动态文件中都要加这代码才行,这种情况很少吧,因为虚拟主机都可以选择更多做301跳转方法,肯定有更适合的。

Cannot modify header information - headers already sent by... 错误

http头部信息已经发送给客户端了,当然就不能再修改头部状态码进行301了。这种情况是因为有HTML实质内容的输出,所以转向代码要放在HTML输出之前。当然其它情况也能造成输出,以PHP为例,如文件< ?php ... ?>之外有空白行,特别是include或者require的文件,这有可能导致输出,可以开启缓存ob_start();只要在转向之前缓存不满,网页就不会被发送。或者在跳转前运行ob_end_clean(),清除所有缓存并关闭缓存,这样再设置头部信息就没问题了。

还可参考:
1. 301跳转(永久重定向)实现方法
2. 16个简单实用的.htaccess技巧
3. 利用.htaccess 的301功能统一网址:让网址变得规范化