RewriteRule混淆:Pattern也匹配现有的目录名

时间:2011-12-27 14:47:48

标签: php .htaccess mod-rewrite

我尝试使用.htaccess中的以下代码将http://domain.com/user/foobar重定向到http://domain.com/user/index.php?id=foobar

RewriteEngine On
RewriteBase /data
RewriteRule ^user/(.*)$ user/index.php?id=$1

但由于某些原因,只有 index.php (不是 foobar )作为ID返回给脚本。

我认为mod_rewrite因为现有的文件夹名称也与正则表达式模式匹配而感到困惑。但是,在将文件夹重命名为_user并相应地修改上述代码后,它可以正常工作。

2 个答案:

答案 0 :(得分:3)

请注意多次应用.htaccess中的重写规则:

0: http://domain.com/data/user/foobar
1: /data/user/foobar -> /data/user/index.php?id=foobar
2: /data/user/index.php?id=foobar -> /data/user/index.php?id=index.php

因此,它始终会将id参数替换为index.php

您需要write a condition如果已经请求index.php,则不会重写,例如通过检查文件是否已存在:

RewriteEngine On
RewriteBase /data

# the following condition applies to the next rule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^user/(.*)$ user/index.php?id=$

答案 1 :(得分:1)

尝试

RewriteEngine On
RewriteBase /data

#if not index.php
RewriteCond %{REQUEST_URI} !index\.php$ [NC]
RewriteRule ^user/(.*)$ user/index.php?id=$1 [L]