主题:【求助】关于 apache 的 rewrite rule -- 铁手
我碰到一个难题了。一时之间搞不清楚是怎么回事,希望河里有人可以帮忙一下。
具体是这样的:
帖子的链接,旧的格式,是用下面这样的方式:
dcbbs/Announce/announce2.asp?BoardID=105&ID=16249
新的格式则是用
article/16249
我想在 apache 的 配置文件里用 rewrite rule 来把旧链接重导向到新的链接格式。
RewriteRule ^dcbbs/Announce/([^&]*)&ID=([0-9]+)$ /article/$2 [R=301,L]
但是不成功。不知道哪位对这方面比较熟悉,帮助一下。
多谢多谢。
/article/16249
新的格式则是用
/article/16249
新的是六位吧,改一改?
因为一些旧的帖子里用的是老链接方式,程序里把这些做了处理。我那个链接结果也被改了。已经换了个方式在上面。
但是因为其他网站引用西西河的时候,有一些还是老的链接方式,因此希望,如果有人点击那些链接,在西西河这里,apache可以识别那些旧链接,然后转到新的链接方式。
如果其他配置都正确的话
RewriteRule ^/dcbbs/Announce/(.*)&ID=(.*)$ /article/$2 [R=301,L]
我现在弄了个土办法:
弄一个目录:
/dcbbs/Announce/
然后在需要请求的文件,比如说 r.php 中,获得ID的值,然后根据这个值,
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://'.$_SERVER['HTTP_HOST'] .'/article/'. $ID);
header('Connection: close');
来完成。
不过我总觉得应该可以在 apache 里用 rewriterul e来实现。奇怪的很。
你拿一个简单的url作测试先:
RewriteRule /a.html /b.html
如果这个不行,就是你的rewrite还没配好。
就是利用了 rewrite rule 来重写后的。
也许是我说的不明确。
目前的状况下,如果浏览器里的网址是 /article/XXXX 的形式,则可以正确访问得到内容,而实际的代码也许是 /nowhere/somthing.php?ID=XXXX 的方式。
我面临的问题,是在于老的链接是 /oldfolder/olderscript.php?ID=XXXX 这样的形式。我希望的是,如果有人访问上面这个链接,系统可以自动跳到 /article/XXXX 的链接上。
不知道为什么,rewrite rule 对这种情况不起作用。
我说说我的理解,看看是不是这个意思。
猜测1:bbs升级之后,以前写的php改作废,改成新的php程序了,所以动态链接改了。
猜测2:为了提高bbs被搜索引擎搜到的几率,采用静态链接代替了动态链接。
铁手为此做了两个rewrite rule
rule1:把/article/XXXX 重定向到/nowhere/somthing.php?ID=XXXX,也就是把静态页面重定向到最新的php页面。
rule2:把/oldfolder/olderscript.php?ID=XXXX重定向到/article/XXXX,这是为了使得老的php动态链接兼容到新的静态链接。
第一步成功了,用户访问/article/XXXX,重定向到/nowhere/somthing.php?ID=XXXX。
第二步没成功,也很简单。
当用户采用/oldfolder/olderscript.php?ID=XXXX访问的时候,根据rule2,会被重定向到/article/XXXX去。
而/article/XXXX本身不是真实的物理路径,还需要再根据rule1重定向到/nowhere/somthing.php?ID=XXXX。
但是,在rule2中,有个参数"L",这个参数的意思是,立即停止重写操作,并不再应用其他重写规则。
也就是说,当rule2开始执行的时候,就已经注定rule1没有机会执行了,所以就。。。。。。
我抽空测试了一下。那些参数[R=301,L]没问题。只要rule2在rule1前面(参见我前一个回复贴)。
有问题的地方是正则表达式这里,因为"/oldfolder/olderscript.php?ID=XXXX"这个url里面,问号以后的部分,rewrite恩engine是不处理的。
rewriteengine只把/oldfolder/olderscript.php当作URI来处理,?之后的部分它认为是参数,所以根本不会参与pattern的匹配。
就做一个地址重定向,其他什么也不做。
也许可以通过 rewrite condition 中的 requesturl 来判断,然后跳转?目前我就直接在相关目录下在相应的程序里判断,然后再跳转。