2011-04-27 44 views
0

所以,我在網站上我想要的頁面,如;如何使用mod_rewrite將網站目錄的外觀「移動」到根目錄而不實際移動文件?在我的代碼中發現錯誤!

www.example.com/shop/index.php 

(或下/店鋪其他任何網頁/爲此事)。到現在爲止出現

www.example.com/index.php 

,但沒有實際移動的文件,這些文件仍位於/店/,但現在通過網址訪問/

看起來很簡單,我可以使用RewriteRule自己做到這一點,非常標準。第二個要求是保持聯繫的舊內容的工作,所以我想類似的事情,但在其他方向,但使用301外部重定向(不重寫),即

www.example.com/shop/index.php 

應該301重定向至;

www.example.com/index.php 

再一次,它自己很簡單。但把它們放在一起,你就會在訪問一個頁面時給你一個可愛的「這個網頁有一個重定向循環」錯誤。不過,我不明白爲什麼,因爲一個規則是重寫,一個是301重定向,他們都有L標誌,所以我認爲沒有更多的規則被處理。所以,我處於我對這個mod_rewrite的理解的極限。

爲了測試和避免我的網站訪問人員,我使用的目錄/ blob /和/ b/with/b /是新的目錄。我現在有的代碼給了重定向循環,

RewriteRule ^blob/(.*)$ "http\:\/\/www\.example.com\/b\/$1" [R=301,NC,L] 
RewriteRule ^b/(.*)$ /blob/$1 [NC,L] 

我想是因爲第一條規則再次執行一次,爲什麼這是使用'L'標誌?我應該檢查或更改哪些條件以便重定向規則僅在原始請求用於/ blob/而不是重寫的URI時才被激活。

回答

0

沒有任何需要額外的查詢參數你可以使用下面的規則在你的。htaccess文件:

Options +FollowSymlinks -MultiViews 
RewriteEngine on 

RewriteCond %{THE_REQUEST} ^GET\s/shop/ [NC] 
RewriteRule ^shop/(.*)$ /$1 [R=301,NC,L] 

RewriteCond %{REQUEST_URI} !^/shop/ [NC] 
RewriteRule ^(.*)$ /shop/$1 [L] 
  • 第一條規則將在瀏覽器中,這是一個外部重定向發送301/shop/foo任何請求/foo
  • 第二條規則將內部重定向任何/foo/shop/goo無在瀏覽器中更改URL,從而確保從$DOCUMENT_ROOT/shop/目錄提供您的實際文件。
+0

非常感謝您花時間幫助:) – kevin 2011-04-27 22:33:29

+0

我的榮幸,希望它能爲您解決。 – anubhava 2011-04-27 22:36:29

0

試試下面的(我用您的實際網址示例):

RewriteEngine On 

RewriteCond %{QUERY_STRING} !rewrite 
RewriteRule ^shop/(.*)$ http://localhost/$1 [R=301,NC,L] 

RewriteCond %{REQUEST_URI} !^\/shop\/ 
RewriteRule ^(.*)$ /shop/$1?rewrite [NC,L,QSA] 

你碰到的問題是,當mod_rewrite做的rewrite它實際上是執行Internal Redirect,這將導致規則來再次應用。所以,這意味着你必須防範這種情況,在這種情況下,我已將參數rewrite添加到重定向檢查的URL。

希望有所幫助。

+0

謝謝,我會試一下。有沒有其他條件可以檢查以獲得相同的結果而不添加參數?我可以看到這導致需要傳遞「真實」參數的問題。我可以測試外部與內部重定向嗎? – kevin 2011-04-27 19:22:32

+0

我添加了'[QSA]'標誌,它將把來自原始請求的查詢字符串附加到重寫中。因此,'/index.php?product = 1' - >'/shop/index.php?rewrite&product = 1'。這是避免重定向循環的最簡單的解決方案。 – clmarquart 2011-04-27 19:40:30

+0

啊,我明白很聰明。感謝加載你的幫助。 – kevin 2011-04-27 22:33:18

相關問題