2012-08-16 108 views
2

我有一個真正奇怪的問題簡單的mod_rewrite問題

我與的.htaccess玩弄,並試圖重定向到/測試/文件夾的索引文件的所有請求。

我的網站位於我的本地htdocs文件夾中的文件夾/ test /中。沒有其他文件存在currenlty。

我想到: 當我訪問的任何URL(例如/test/category/one/)我應該被重定向到/test/index.php

會發生什麼 我得到一個404 Not Found

我的.htaccess的樣子這個:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /test/index.php?__route=$1 [L,QSA] 

我試過設置RewriteBase /test/

這是直截了當的,所以爲什麼它不工作?

我有一個Wordpress網站在另一個文件夾中,並與自定義重寫工作完美無瑕。

我甚至將Wordpress的.htaccess內容複製到測試網站,用/ test /替換重寫基準和最後一條規則。

WordPress的的.htaccess:(這在一個單獨的WP工程安裝在同一服務器上)

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test/ 
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /test/index.php [L] 
</IfModule> 

# END WordPress 

我一直在這個苦苦掙扎了一會兒,看了不少SO沒有幫助文章。

我甚至寫了一個重寫日誌文件,現在當我瀏覽到測試網站時沒有顯示任何內容,但訪問Wordpress網站時寫了很多行。

我在Win64機器上運行XAMPP。

任何幫助將不勝感激! =)

+1

「它不工作」 - 你的問題很好的解釋,我聯繫Charles Xavier來幫助我弄清楚「不起作用」對你意味着什麼。 – hakre 2012-08-16 17:46:51

+0

@hakra對於不提及,我表示歉意。什麼'不起作用'是重寫規則沒有得到執行,我得到了'404 Page Not Found'錯誤。應該發生的事情是我被重定向到/test/index.php – tone7 2012-08-16 17:59:17

+0

'。'恰好匹配一個字符,並且沒有捕獲的組。嘗試'(。+)'。 – 2012-08-16 18:00:00

回答

5

更新:此外,請確保您的.htaccess文件中的行結尾設置得當。有時Apache可能會阻塞任何不包含新行(\ n)字符的內容。

因此,它看起來像我想要(在某種程度上)模擬WordPress正在做什麼。下面是我如何處理這種情況下,當我開發一些軟件,做同樣的事情:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ /index.php [L] 
</IfModule> 

對於存在的文件(即無論是-f-d測試通過),我們爲他們服務了不變。否則,我們將傳入的請求重定向到index.php。請注意,路徑的/test部分未包含在RewriteRule中,因爲RewriteBase是從我們開始的地方設置的。因此,在您的示例中,我認爲它最終會成爲:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^(.*)$ /index.php?__route=$1 [L,QSA] 
</IfModule> 

FWIW,我不是.htaccess專家。我只是發現這在過去爲我工作。

另外,如果你是一個共享的主機(如DreamHost的),您可能需要設置相應的規則,以允許默認的錯誤文件。一些共享的網絡主機提供一個文件(failed_auth.html是一個例子)用於錯誤情況。如果你沒有過濾掉這種情況下,你可能最終有404

+0

感謝您的回覆,但不幸的是,這也不起作用。 (即使它是一個只有.htaccess和index.php文件的空目錄)另一件事,如果我複製並粘貼你的例子,我得到一個錯誤500錯誤服務器,但是當我把'#'在第一行,它給出了一個'404 Not Found'錯誤,這也很奇怪 – tone7 2012-08-16 19:21:19

+0

如果第一行給出錯誤500,那麼你的Web服務器會以某種方式錯誤配置(例如,必須禁用mod_rewrite)。 。在 – 2012-08-16 19:24:51

+0

更多信息,您的服務器日誌這是Apache的錯誤日誌中的錯誤:' tone7 2012-08-16 19:34:34

2

這應該做的伎倆:

# Activate the rewrite module. 
RewriteEngine On 
# Ensure the requested URL is not a file. 
RewriteCond %{REQUEST_FILENAME} !-f 
# Ensure the requested URL is not a directory. 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php?__route=$1 [L,QSA] 
+0

感謝您的答覆,但不幸的是這也沒有工作:( – tone7 2012-08-16 19:21:47

+0

現在這個代碼工作。再次感謝,這是一個行結束的問題。只是一個供參考。見@約拿的答案評論。 – tone7 2012-08-17 16:48:02