在这里有一个真正的脑筋急转弯。 一切都很好,直到我到达 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]
答案 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]
为每一行做同样的事情。