Discuz教程网

IIS下的万能301跳转方法,URL伪静态重写加PHP301重定向

[复制链接]
authicon dly 发表于 2013-1-12 20:31:28 | 显示全部楼层 |阅读模式
大家都知道目前301重定向是最有用的跳转方式,不仅可以实现SEO亲和性跳转,而且还可以实现权重的传递。

大家也通常会在不同情况下有不同的301重定向需求,如要将不带www的域名301到带www的域名、将闲置老域名301到主域名、将原放在子目录下的论坛301到新的bbs二级域名、更换域名将某域名下所有页面301重定向到新域名下对应页面等等。

分析不同情况的301的需求,其实都需要保证如下两点:

1) 成功跳转,并正确发送301状态

2) 实现原页面跳转到新对应的页面

第一点怎么实现大家基本都有常见到各种各样的301重定向教程,而第二点因为不同CMS/程序、不同环境,实现方便难有统一的解决办法。下面落叶分两点先简单介绍下IIS下(服务器、虚拟主机)如何实现正确的301跳转,然后再重点介绍落叶原创的百试不爽的万能301跳转方法 - URL伪静态重写+PHP301跳转,实现所有程序对应页面跳转。

1. IIS下正确实现基本的301跳转:

如我为了保证网站域名单一性,集中权重,希望将pmume.com 301永久重写向到www.pmume.com,那么:

1) 服务器:如果有服务器的操作权限,直接另外新建一个网站,然后在IIS上设置“资源永久重定向”:

035959rjwurcqwc540mmqx.jpg.thumb.jpg
2) 虚拟主机:在IDC虚拟主机后台把不带www的域名绑定一个子目录,然后,在子目录下放置一个index.php,在其中放上301跳转的代码:
  1. <?php
  2. header("HTTP/1.1 301 Moved Permanently");
  3. header('location:http://www.discuz.com/');
  4. exit;
  5. ?>
复制代码
上面服务器上直接IIS上的操作,不仅可以实现跳转到首页,勾选“资源的永久重定向”还可以实现原域名下所有子页面都跳转到新域名下对应页面,而上面虚拟主机上的301跳转代码则只可实现首页的跳转或者单一目录的跳转。

2. 对应页面跳转的万能301:URL伪静态重写+PHP301

对应页面301跳转的方法有很多,最笨的方法是手动一页一页301到对应的新页面,但实际不具可操作性,除非只是少数几个页面,要是更新域名等的301,基本不可能。那么怎样通用的实现对应页面的301跳转呢?URL伪静态+PHP301又是怎样操作的呢?

要实现对应页面跳转,首先要分析原页面URL的结构,然后分析新页面的URL规则,然后实现301的跳转,落叶通过采用的URL伪静态+PHP301的操作是通过分析原URL的规则,利用IIS中httpd.ini中的伪静态功能,将原URL正则重写到单一的PHP入口,然后通过该单一PHP中获取到原URL的特征字符串,对应跳转到新页面的特征字符串。

上面一句话其实已经概括完了整个的操作方法,下面举例说明实际的实现。

例一:我想将原放在子目录下www.discuz.net/bbs/访问的论坛更换为bbs.discuz.net

a.伪静态重写URL:

将下面伪静态规则放于根目录下的httpd.ini文件中
  1. [ISAPI_Rewrite]
  2. # 3600 = 1 hour
  3. CacheClockRate 3600
  4. RepeatLimit 32
  5. # Protect httpd.ini and httpd.parse.errors files
  6. # from accessing through HTTP
  7. RewriteRule ^(.*)/bbs/(.*)$ $1/bbs/301\.php\?go=$2 [L]
复制代码

作用:将BBS目录下所有链接都重写到index.php并使用go参数来传递,如http://www.discuz.net/bbs/thread-112-1.html的链接重写成http://www.discuz.net/bbs/301.php?go=thread-112-1.html,下一步就是在index.php中接收go参数(如thread-112-1.html),301跳转到http://bbs.discuz.net/thread-112-1.html 。将内页多入口转换为经过index.php的单一入口,集中控制。

b.在301.php中接收参数,并实现301永久重定向:
  1. <?php
  2. $go=$_GET['go'];//获取跳转页面链接部分,如"thread-112-1.html",又如forum.php?fid=32等
  3. header("HTTP/1.1 301 Moved Permanently");//发送301状态,之后的所有跳转均为301
  4. header('location:http://bbs.discuz.net/'.$go);//根据go参数跳转到对应页面
  5. exit;
  6. ?>
复制代码

例二:我原论坛放在www.discuz.net主域名下的,现在主域名想做文章站,论坛换到bbs.discuz.net下,我想原www.discuz.net域名原论坛的部分URL全301到bbs.discuz.net对应页面,而新的文章内容不跳转。如
www.discuz.net/forum-1-1.html
www.discuz.net/thread-1-1-1.html
www.discuz.net/tag-%D6%AA.html
跳转到 bbs.discuz.net/forum-1-1.html,而www.discuz.net/article/123.html等不跳转。

a.分析你要部分跳转的URL的种类及大致格式:

如你上面提到的要跳转的有论坛版块文章列表页、论坛帖子内容页、论坛的TAG标签页,这三类页面的URL结构很典型,即你说的:
www.discuz.net/forum-1-1.html
www.discuz.net/thread-1-1-1.html
www.discuz.net/tag-%D6%AA.html

b.把这些特征页面全伪静态重写到一个301.php页面:
帖子列表页:RewriteRule ^(.*)/forum-(.*)$ $1/301\.php\?go=forum-$2 [L]
帖子内容页:RewriteRule ^(.*)/thread-(.*)$ $1/301\.php\?go=thread-$2 [L]
Tag标签页:RewriteRule ^(.*)/tag-(.*)$ $1/301\.php\?go=tag-$2 [L]
等等,其它特征页类似重写,需要你对伪静态正则写法有一定了解。

3.PHP301对应跳转:
  1. <?php
  2. $go=$_GET['go'];
  3. header("HTTP/1.1 301 Moved Permanently");
  4. header('location:http://bbs.discuz.net/'.$go);
  5. exit;
  6. ?>
复制代码





上一篇:用Rewrite伪静态文件解决Discuz x2.5域名多入口问题的方法
下一篇:Discuz X2.5解决云平台同步站点信息失败 (ERRCODE:1)的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2024-5-19 07:09

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表