htaccess RewriteRules碰撞

时间:2011-05-02 17:53:58

标签: php mysql .htaccess

在这里有一个真正的脑筋急转弯。 一切都很好,直到我到达 mysite.com/index.php?page=XXX&parent_url=XXX&child_url=XXX 然后我收到此错误

警告:include(browse / 12-oclock-bars / cbr-600-f4i.php)[function.include]:无法打开流:/home/leb/public_html/index.php中没有这样的文件或目录在第167行

警告:include()[function.include]:无法打开'browse / 12-oclock-bars / cbr-600-f4i.php'以包含(include_path ='。:/ usr / lib / php')in第167行/home/leb/public_html/index.php

但前两行工作正常。为什么第3行不能用于我的网站。但是如果我注释掉前两行,那么第三行就行了......我很困惑。

这是我的HTACCESS文件。任何帮助将不胜感激。

RewriteCond %{HTTP_HOST} ^mysite.com [NC] 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301]


RewriteCond %{REQUEST_URI} !^index.php?
RewriteRule ^(.*)/$ /index.php?page=$1 [L,NC]
RewriteRule ^(.*)/(.*)/$ /index.php?page=$1&parent_url=$2 [L,NC]
RewriteRule ^(.*)/(.*)/(.*)/$ /index.php?page=$1&parent_url=$2&child_url=$3 [L,NC]

------------------------------------------- < / EM> 修订了下面的新问题

在这里,第3行不起作用,但其他所有人都行不通,如果我改变其位置,其他人就会停止工作。

RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ /index.php?page=$1&parent_url=$2&child_url=$3product=$4 [L,NC]
RewriteRule ^(.*)/(.*)/(.*)/$ /index.php?page=$1&parent_url=$2&child_url=$3 [L,NC]
RewriteRule ^(.*)/(.*)/(.*)/$ /index.php?page=$1&parent_url=$2&product=$3 [L,NC]  <---
RewriteRule ^(.*)/(.*)/$ /index.php?page=$1&parent_url=$2 [L,NC]
RewriteRule ^(.*)/$ /index.php?page=$1 [L,NC]

4 个答案:

答案 0 :(得分:1)

正如@jeroen所评论的那样,规则2和3的传入URL没有区别。虽然它们应该去的目标页面不同,但是您在两个规则中检查的传入URL仍然是{{1 }}。如果您在URL中有一些指标,例如规则3,则为产品:

/a/b/c

根据此更改,您的规则是当前规则,该规则必须先于您当前的第二条规则。

此外,在匹配此类部分时,我发现使用 RewriteRule ^product/(.*)/(.*)/$ /index.php?page=product&parent_url=$2&product=$3 [L,NC] 代替([^\/]*)更加容易。通过这种方式,该组会将所有内容与(.*)进行匹配,您会发现对规则排序的依赖程度较低。

希望这有帮助。

答案 1 :(得分:0)

第2行和第3行查找相同的模式,因此执行将在第2行终止,并且在匹配的情况下永远不会到达第3行。

答案 2 :(得分:0)

我得出结论,在PHP中处理url更容易。

您可以使用htaccess中的以下代码传递整个路径:

# pass url path as get variable via "path"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [L,QSA]

在PHP中,您可以爆炸路径:

//Assuming $_GET['path'] = 'this/is/an/example/';

// Trim extra '/' off right side
$path = rtrim($_GET['path'],'/');

//explode the path by "/"
$pathArray = explode("/",path);

echo $pathArray[0]; // outputs "this"
echo $pathArray[1]; // outputs "is"
echo $pathArray[2]; // outputs "an"
echo $pathArray[3]; // outputs "example"

// It is sometimes easier to work with a path in reverse:
$reversedPathArray = array_reverse($pathArray);

$page = $reversedPathArray[0];

echo $page; // outputs "example"

答案 3 :(得分:0)

尝试用([^ /] +)替换(。*)

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /index.php?page=$1&parent_url=$2&product=$3 [L,NC]

为每一行做同样的事情。