我的mod_rewrite出现了一个奇怪的错误。
这是我的htaccess:RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?a=$1
RewriteRule ^(.*)/(.*)$ index.php?a=$1&b=$2
RewriteRule ^(.*)/(.*)/(.*)$ index.php?a=$1&b=$2&c=$3
当我在地址栏输入:
localhost/test/1/2
在我的index.php文件中我有:
echo '<pre>';
print_r($_GET);
echo '</pre>';
我应该看到的是:
Array
(
[a] => test
[b] => 1
[c] => 2
)
但是我得到的结果是:
Array
(
[a] => index.php
[b] => 1
[c] => 2
)
我做错了什么?
If-Then-Else逻辑,互斥(和最终)规则
有几个问题。
-
In mod-rewrite
,一组条件只适用于一条规则。但是在这里,你试图将它们应用于多个规则。 - 您的规则不是互斥的。
.*
匹配所有字符,因此它可以匹配所有三种模式。我们需要更具体的规则。 - 你的规则不是最终的(需要
L
标志)。
试试这个:
RewriteEngine On
# IF: Does the file or folder exist?
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
# THEN leave unchanged, skip 3 rules
RewriteRule ^ - [L,S=3]
# ELSE (the file or folder does not exist)
RewriteRule ^([^/]+)/?$ index.php?a=$1 [L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?a=$1&b=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?a=$1&b=$2&c=$3 [L]
# FINALLY: leave unchanged
RewriteRule ^ - [L]