2009-06-02 119 views
2

我想讓URL重寫在我的網站上工作。這裏是我的.htaccess的內容:Apache URL重寫,

RewriteEngine On 
RewriteRule ^blog/?$ index.php?page=blog [L] 
RewriteRule ^about/?$ index.php?page=about [L] 
RewriteRule ^portfolio/?$ index.php?page=portfolio [L] 
#RewriteRule ^.*$ index.php?page=blog [L] 

現在3條註釋掉重寫規則很好地工作,如果我嘗試http://www.mysite.com/blog/,我重定向到http://www.mysite.com/index.php?page=blog,同爲「約」和「組合」。但是,如果我輸錯博客,假設我嘗試http://www.mysite.com/bloh/,那麼很明顯我會遇到404錯誤。評論的最後一條規則是幫助防止這種情況發生。任何URL都應該被重定向到博客,但是當然,即使我們已經成功地使用了前一個,這個規則仍然被解析,所以我使用了「last」標誌([L])。如果我取消註釋我的最後一條規則,則任何內容(包括博客,關於和投資組合)都將重定向到博客。一旦找到匹配規則,「last」標誌不應該立即停止執行嗎?

謝謝。

回答

2

你可以添加一個條件,如:

RewriteCond %{REQUEST_URI} !^index\.php 

我還會提到,使用RewriteRule ^.*$是打破所有的媒體請求(CSS,JS,圖像),以及一個好辦法。您可能要添加一些條件,如:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

要確保你沒有試圖改寫實際文件或目錄的服務器上存在。否則,他們將無法訪問,除非index.php也服務於這些!

3

是的,最後一個標記表示它不會應用此規則之後的任何規則

重寫URL後,它會使用新的重寫URL進行內部請求,該URL將與您最近的RewriteRule相匹配,因此您的重定向會進入無限循環。

使用RewriteCond指令將重寫限制爲不以index.php開頭的URL,並且您應該沒問題。

1

從Apache的mod_rewrite docs

'最後| L'(最後一條規則) 停止重寫的過程這裏不適用任何更多重寫 規則。這對應於Perl 上一個命令或 C中的中斷命令。使用此標誌可防止當前重寫的URL 被 按以下規則進一步重寫。 但是請記住,如果 重寫規則生成內部 重定向(其經常發生當 在每個目錄上下文重寫), 這將重新注入該請求並 將導致重複 處理從第一開始重寫規則。

你可以使用

ErrorDocument 404 /index.php?page=blog 

,但你應該知道的事實,它不返回404錯誤代碼,而是一個重定向一個,我不知道這是否是這樣的良好的做法。

+0

感謝您的回答。如果仔細觀察,我當前的正則表達式已經考慮了可選的尾部斜槓。 – 2009-06-02 19:06:09

+0

哦,是的。我沒有看到。對不起:) – andi 2009-06-02 19:41:31

1

在[L]對請求進行預處理後,整個處理將再次運行新的(重寫的)URL。您可以使用此您的其他規則之前離開該循環:

RewriteRule ^index.php - [L] 

,這意味着「爲的index.php,不重寫,離開處理。」