2013-08-12 89 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');'。这也可以让你展示个性化的内容,例如“拖拉机蜜蜂”或任何你喜欢的搜索结果。它比一个简单的错误文档 –