2013-10-31 103 views
1

我正在創建一個htaccess文件,並試圖添加一個404頁面。 但是,如果我轉到此網站上的一個不存在的頁面,則404頁面不會顯示。相反,我得到一個「500內部服務器錯誤」。Htaccess文件內部服務器錯誤

任何想法可能是錯的?

的.htaccess:

SetEnvIfNoCase User-Agent "^libwww-perl*" block_bad_bots 
Deny from env=block_bad_bots 

RewriteEngine On 
RewriteRule ^solution-([^/]*)/([^/]*)$ /solutions.php?category=$1&solution=$2 [L] 
RewriteRule ^solution-([^/]*)$ /solutions.php?category=$1 [L] 
RewriteRule ^page-([^/]*)$ /about.php?page=$1 [L] 

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) $1.php [L] 

ErrorDocument 404 /404.php 
+0

您可以在錯誤日誌中找到答案。 – fuxia

+0

我在服務器的管理面板中找不到任何日誌.. – Kim

回答

1

這是導致錯誤的規則:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) $1.php [L] 

這是因爲如果請求的是一個不存在的文件一個不存在的目錄,則規則得到應用。這意味着什麼都不會返回404,因爲這個規則將被應用。現在問題是規則重寫了.php擴展名,即使php文件實際上並不存在。因此重寫引擎再次循環和規則被再次應用,然後發動機循環,規則被再次應用等

您需要添加另一個條件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule (.*) $1.php [L] 

條件稱,如果您在請求的末尾添加.php,如果該文件存在,則應用規則。

+0

謝謝!工作很棒! – Kim

1

你就近了。將來,您可以調試.htaccess文件並在每行(或一組行)之前添加#並查看錯誤的位置,從而找出失敗的原因。

首先,您不需要重新聲明RewriteEngine On兩次。一次就夠了。

如果禁用規則的第二塊(其中第二RewriteEngine On是,你會發現你的錯誤處理程序工作正常。這就是你的錯誤的來源。所以,讓我們把它分解。

RewriteCond %{REQUEST_FILENAME} !-d 

這意味着:對於不符合物理目錄的所有請求

RewriteCond %{REQUEST_FILENAME} !-f 

這意味着:對於不匹配的物理文件的所有請求

RewriteRule (.*) $1.php [L] 

這意味着:對於上面的所有匹配條件,發送一個用戶後綴爲.php的文件名。例如:mysite.com/bananas將嘗試加載頁面的內容bananas.php

因此,它在最後一行導致您的錯誤。如果您有意輸入不存在的URL,則會嘗試加載bananas.php,然後拋出錯誤,因爲該文件不存在。但是邏輯不會故障轉移到ErrorDocument處理程序,因爲它在查找該文件時已遇到錯誤。

因此,簡短的解決方案是刪除該行塊,然後任何不由第一行處理的東西將由您的/404.php提供。或者,您可以將最後一行從$1.php更改爲全能腳本(例如index.php),然後執行自己的錯誤檢查並提供404.php的內容。