2013-08-12 90 views
1

對我的站點執行404錯誤處理有點困難。通常這不是問題,但在這種情況下,設置是不同的。使用mod_rewrite模式匹配errorDocument規則

我不得不在我的.htaccess文件中使用模式匹配進行URL重寫,即RewriteRule ^([^/]+)\/$RewriteRule ^products\/([^/]+)\/([^/]+)\/$這是由於網站具有受其他用戶控制的CMS,他們可以添加新頁面I.e. www.yourdomain.com/pagename「pagename」是任何新頁面。

任何輸入的URL都可以說「/ about」匹配RewriteRule ^([^/]+)\/$然後在數據庫中檢查以找到匹配項,如果找到匹配項,則用戶重定向到正確的頁面,如果不匹配,則可以重定向用戶訪問特定頁面或設置http狀態碼。

唯一的問題是我想保留不正確的URL,並且PHP重定向會覆蓋那個。

代碼:

ErrorDocument 403   /errors.php?error=403 
ErrorDocument 404   /errors.php?error=404 
ErrorDocument 500   /errors.php?error=500 
ErrorDocument 503   /errors.php?error=503 

RewriteEngine         On 

RewriteRule ^([^/]+)\/$      ?cat=generic&page=$1 [L] 
RewriteRule ^products\/([^/]+)\/([^/]+)\/$ ?cat=product&page=$2 [L] 

現在我敢肯定這個問題是由於其重寫規則我在的地方,所以我想我期待的是仍然讓我重寫替代抓住任何新創建的頁面url,但也允許成功的錯誤文檔處理。

如果我遺漏了任何重要的代碼/信息,請讓我知道,我將使用它編輯帖子。

非常感謝您的任何建議/幫助。

編輯::

PHP腳本處理該頁面的內容。

function page_handler() { 
    if(!isset($_GET['cat'])): 
     $_GET['cat'] = 'generic'; 
     $_GET['page'] = 'home'; 
    endif; 

    // Connect to the database 
    $link = db_connect_cms(); 

    // Grab the id of the page 
    $qry = mysqli_query($link," 
     SELECT hash,slug 
     FROM cms_web_pages 
     WHERE slug='".$_GET['page']."' 
     AND published=1") 

     or die(mysqli_error($link) 
    ); 

    $row = mysqli_fetch_object($qry); 

    // If there is a match in the db 
    if(mysqli_num_rows($qry) > 0): 
     $id_hash = $row->hash; 
    else: 
     $_GET["error"] = "404"; 
     require_once($_SERVER["DOCUMENT_ROOT"] . "/errors.php"); 
    endif; 

    return array($id_hash); 
} 

回答

1

可以實現通過替換在PHP代碼中這一行:

header("location: /errors.php?error=404"); 

與此:

// have this code when DB lookup fails 
$_GET["error"] = "404"; 
include($_SERVER["DOCUMENT_ROOT"] . "/errors.php"); 
exit; // required to prevent showing current page after error document 
+0

更好。謝謝你的代碼,它確實顯示了正確的內容,但是使用'include'函數只是增加了已存在頁面中的文件內容。基本上有2頁內1.任何想法? – zealisreal

+0

是的,的確,'include'會在你的頁面內容後顯示來自'errors.php'的內容(即它不會取代你頁面的內容)。 – anubhava

+1

但是,您應該在PHP腳本開始時進行數據庫查找,然後根據查詢結果決定調用上面的include snippet和'exit;'從其餘的PHP代碼中解救出來。 – anubhava

0

只有通過使用.htaccess才能獲得所需的內容。

這是你如何處理這個問題:

  1. RewriteRule經過處理請求的index.php
  2. 您的應用程序中查找數據庫
  3. 您的應用程序必須引發錯誤或重定向到錯誤文檔。

這是不可能的,因爲您的.htaccess可能會引發HTTP錯誤,因爲處理已交給PHP腳本。

+0

有什麼辦法,我持之以恆的不良URL可以說* .COM /當PHP無法在數據庫中找到匹配項並將用戶重定向到404錯誤的頁面時,拖拉機 - 蜜蜂?如果沒有這個,那麼如果'header'重定向是'header(「location:/errors.php?error=404」),那麼* .com/errors.php?error = 404會顯示在地址欄中。 – zealisreal

+1

而不是重定向到'/errors.php?error = 404',你可以在你的PHP腳本中使用'header('HTTP/1.0 404 Not found');'。這也可以讓你展示個性化的內容,例如「拖拉機蜜蜂」或任何你喜歡的搜索結果。它比一個簡單的錯誤文檔 –