2008-12-18 115 views
0

我想將使用原始URL請求的舊站點的URL重定向到我在CodeIgniter中實現的新站點。我只是想將它們重定向到我的索引頁面。我也想擺脫我的URL中的「index.php」,這樣我的URL就可以像example.com/this/that一樣簡單。所以,這是.htaccess文件我已經創建:爲什麼Apache mod_rewrite沒有像預期的那樣運行

RewriteEngine on 
Options FollowSymLinks 

RewriteBase/

RewriteCond $1 ^assets 
RewriteRule ^(.*)$ example/production/$1 

RewriteCond %{QUERY_STRING} .+ 
RewriteRule ^(.*)$ index.php? [R=301] 

RewriteCond $1 !^(index\.php|example|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 

還應當指出的是,我的index.php實際上是一個符號鏈接example/production/index.php

現在,第一條規則按預期工作 - 我所有的樣式和圖像都顯示得很好,這是我遇到的第二條規則。第二條規則基本上是銷燬查詢字符串並重定向到我的索引頁面(外部)。所以,我發現這個在Apache手冊:

注:查詢字符串

格局將不會對查詢字符串相匹配。相反,您必須使用帶有%{QUERY_STRING}變量的RewriteCond。但是,您可以在替換字符串中創建URL,其中包含查詢字符串部分。只需在替換字符串中使用問號,表示應將以下文本重新注入查詢字符串中。當您要刪除現有的查詢字符串時,只需使用問號結束替換字符串。要將新查詢字符串與舊查詢字符串結合使用,請使用[QSA]標誌。

但是,當我嘗試訪問其中一箇舊頁面,而不是重定向到我的索引頁面時,出現404頁面未找到錯誤。我已經找到了一種解決方法,將其作爲內部重定向,但我真的很喜歡它是外部的。

下一個問題,以及令我莫名其妙的問題是第三條規則。我希望這可以做到以下幾點。如果我輸入:

http://example.com/this/thing 

我希望它重新路由到

http://example.com/index.php/this/thing 

不幸的是,這是行不通的。相反,無論我輸入什麼內容,它總是會路由到我的索引頁面,就好像URL中沒有其他內容一樣(它只是去http://example.com/)。

而且,更令人困惑的我,如果我用下面的替換規則:

RewriteCond $1 !^(index\.php|example|robots\.txt) 
RewriteRule ^(.*)$ index.php/this/thing 

如果我在如http://example.com/other/thing網址類別,那麼它會去http://example.com/index.php/this/thing不如預期,但如果我輸入http://example.com/this/thinghttp://example.com/(我的索引頁)。我無法讓頭或尾巴出來。任何幫助將不勝感激。

回答

1

這應該解決您的index.php的問題,它會簡單地檢測,如果一個robots.txt可用:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
+0

嗯 - 這似乎也不起作用。問題是我的URL並不是真的要求文件名或目錄。例如:example.com/index.php/this/thing應該調用'this'控制器的'thing'方法。 – 2008-12-19 06:54:07

1

嗯 - 這似乎並沒有任何工作。問題是我的URL並不是真的要求文件名或目錄。例如:example.com/index.php/this/thing應該調用'this'控制器的'thing'方法。 - 史蒂芬斯

的條件是:如果請求不是一個文件,而不是一個目錄,所以這是正確的,你應該做的是結合請求字符串的追加:

RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
相關問題