五千年(敝帚自珍)

主题:【求助】关于 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]

    但是不成功。不知道哪位对这方面比较熟悉,帮助一下。

    多谢多谢。

    • 家园 干脆不用apache做这个行不行?把原来位置的asp改改,

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

    • 家园 试试看

      如果其他配置都正确的话

      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
                  • 家园 说到点子上了。的确是这个问题。

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

    • 家园 没看出差别来……

      帖子的链接,旧的格式,是用下面这样的方式:

      /article/16249

      新的格式则是用

      /article/16249

      新的是六位吧,改一改?

      • 家园 不好意思。上面的例子做了修正。

        因为一些旧的帖子里用的是老链接方式,程序里把这些做了处理。我那个链接结果也被改了。已经换了个方式在上面。

        但是因为其他网站引用西西河的时候,有一些还是老的链接方式,因此希望,如果有人点击那些链接,在西西河这里,apache可以识别那些旧链接,然后转到新的链接方式。

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


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

Copyright © cchere 西西河