五千年(敝帚自珍)

主题:【求助】关于 apache 的 rewrite rule -- 铁手

共:💬12 🌺2
全看树展主题 · 分页首页 上页
/ 1
下页 末页
家园 【求助】关于 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来实现。奇怪的很。

家园 首先你确认rewrite engine是否work

你拿一个简单的url作测试先:

RewriteRule /a.html /b.html

如果这个不行,就是你的rewrite还没配好。

家园 rewrite engine 是工作的。现在的链接方式

就是利用了 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没有机会执行了,所以就。。。。。。

关键词(Tags): #apache#url
家园 回头我试试看。你说的很可能是对的
家园 知道问题在哪了但是好像没办法

我抽空测试了一下。那些参数[R=301,L]没问题。只要rule2在rule1前面(参见我前一个回复贴)。

有问题的地方是正则表达式这里,因为"/oldfolder/olderscript.php?ID=XXXX"这个url里面,问号以后的部分,rewrite恩engine是不处理的。

rewriteengine只把/oldfolder/olderscript.php当作URI来处理,?之后的部分它认为是参数,所以根本不会参与pattern的匹配。

关键词(Tags): #url重写#apache
家园 干脆不用apache做这个行不行?把原来位置的asp改改,

就做一个地址重定向,其他什么也不做。

家园 说到点子上了。的确是这个问题。

也许可以通过 rewrite condition 中的 requesturl 来判断,然后跳转?目前我就直接在相关目录下在相应的程序里判断,然后再跳转。

全看树展主题 · 分页首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河