url递归重写

时间:2012-01-21 14:50:05

标签: regex mod-rewrite

我正在尝试将网址从www.xxx.com/test.com重写为www.xxx.com/my.php?d=test.com 使用以下指令:

        Options Indexes FollowSymLinks
        RewriteEngine On

        RewriteRule ^((.+)\.(.+))$ my.php?d=$1

这不起作用,例如,网址是www.xxx.com/test.com 它似乎被重写为www.xxx.com/my.php?d=test.com 然后重写到www.xx.com/my.php?d=my.php或类似的东西。这是否意味着模式正在递归应用? 我该如何修复正则表达式?

2 个答案:

答案 0 :(得分:0)

这对我有用:

RewriteRule ^(.+)\.(.+)$ my.php?d=$1.$2

效果不是递归地应用规则(不会发生),它根本就不匹配。

顺便说一句,如果你想让引擎停在特定的一行,你可以添加[L]。

测试重写规则的简便方法是this website

答案 1 :(得分:0)

Mod重写将一遍又一遍地通过重写引擎运行URI,直到URI在通过重写引擎之前和之后相同。这就是发生的事情:

  1. URI test.com
  2. 规则^((.+)\.(.+))$匹配,URI重写为 my.php (带有一些查询字符串 d = test.com )< / LI>
  3. 比较: test.com my.php 不同,通过重写引擎运行URI
  4. URI my.php
  5. 规则^((.+)\.(.+))$匹配,URI重写为 my.php (带有一些查询字符串 d = my.php )< / LI>
  6. 比较: my.php my.php 相同,在URI匹配之前和之后,停止编写
  7. 您的结果是/my.php?d=my.php

    您需要添加条件,以便my.php不会应用规则。在您的重写之前添加此内容

    RewriteCond %{REQUEST_URI} !^/my.php