2011-05-02 48 views
0

在這裏有一個真正的腦傳情。 一切正常,它應該像,直到我去 mysite.com/index.php?page=XXX & parent_url = XXX & child_url = XXX 後來我得到這個錯誤htaccess重寫規則碰撞

警告:包括(瀏覽/ 12點鐘-bars/cbr-600-f4i.php)[function.include]:未能打開流:沒有這樣的文件或目錄在線167上的/home/leb/public_html/index.php

Warning:include [function.include]:在/ home/leb/public_html/index中打開包含(include_path ='。:/ usr/lib/php')的'browse/12-oclock-bars/cbr-600-f4i.php'失敗.php on line 167

但前兩行工作正常。爲什麼第三行不適用於我的網站。但是,如果我評論前兩行,比第三行更有效......我很困惑。

這是我的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] 

--------------------------------------- ---- 用下面的新問題修改

在這裏,第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

看起來我不得不顛倒我的重寫規則的順序,現在就工作。希望這有助於未來的其他人。 – Dave 2011-05-02 18:11:54

+0

這看起來更像是一個PHP問題,而不是重寫問題。 「瀏覽」目錄不在包含路徑上。導致警告的腳本的絕對位置的位置是什麼? 「瀏覽」的絕對位置是什麼? – outis 2011-05-02 18:12:51

+0

它絕對是一個htaccess的問題。我修改了我原來的帖子..看看列出的第3行 – Dave 2011-05-02 18:42:46

回答

1

由於@jeroen評論說,沒有在無差異規則2和規則3的傳入URL。雖然它們應該轉到的預期頁面不同,但您在兩條規則中檢查的傳入URL仍然是/a/b/c。如果你有在URL中一些指標,譬如說第3條,正一品:

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

隨着這種變化,作爲你的規則目前,該規則將不得不拿出你當前的第二規則之前。

此外,當匹配這樣的部分時,我發現使用([^\/]*)而不是(.*)更容易。通過這種方式,該組匹配所有內容,直到/,並且您會注意到對規則排序的依賴性降低。

希望這會有所幫助。

+0

大大幫助非常簡單和快速修復,直到我成爲對htaccess的知識,因爲我與PHP lol。非常感謝! RewriteRule^product /(.*)/(.*)/(.*)/$ /index.php?page=product&parent_url=$1&child_url=$2&product=$3 [L,NC] RewriteRule^product /( 。*)/(。*)/ $ /index.php?page=product&parent_url=$1&product=$2 [L,NC] RewriteRule^browse /(.*)/(.*)/$ /index.php? page = browse&parent_url = $ 1&child_url = $ 2 [L,NC] RewriteRule^browse /(.*)/$ /index.php?page=browse&parent_url=$1 [L,NC] RewriteRule ^(。*)/ $ /index.php?page=$1 [L,NC]很多 – Dave 2011-05-02 19:56:46

0

第2行和第3行尋找相同的模式,因此執行將終止在第2行,並且在匹配的情況下決不會到達第3行。

+0

我該如何去分離它們,以便一切正常?還是有更簡單的方法去解決這個問題?提前致謝。 – Dave 2011-05-02 18:55:37

+0

@Dave在網址中沒有任何標識符的情況下,很難確定您的第三個參數是「child_url」類型還是「product」類型。兩者之間是否有明顯的區別,比如'child_url'總是以'http'開始? – jeroen 2011-05-02 18:57:55

+0

是的,index.php?page = product&parent_url = exhaust-systems&product = akrapovic-slip-on – Dave 2011-05-02 19:02:48

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" 
+0

我明白你在說什麼了。我會盡力回覆你。謝謝。 – Dave 2011-05-02 19:09:55

+0

@Dave - 聽起來不錯。它讓事情變得更加簡單,只是我認爲我會通過提示:) – DesignerGuy 2011-05-02 19:11:14

0

嘗試更換(。*)([^ /] +)

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

而且做每一行同樣的事情。