1

在我的网站上实施 404 错误处理有点困难。通常这不是问题,但在这种情况下,设置是不同的。

我必须在我的 .htaccess 文件中使用模式匹配进行 URL 重写RewriteRule ^([^/]+)\/$,即RewriteRule ^products\/([^/]+)\/([^/]+)\/$这是因为该站点的 CMS 由可以添加新页面的其他用户控制,即 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);
}
4

2 回答 2

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
于 2013-08-12T12:16:17.250 回答
0

您不能仅通过使用 .htaccess 来接受您正在寻找的内容。

这是您可以处理的方式:

  1. RewriteRule请求的处理传递给 index.php
  2. 您的应用程序查找数据库
  3. 您的应用程序必须引发错误或重定向到错误文档。

您的 .htaccess 不可能引发 HTTP 错误,因为处理已交给 PHP 脚本。

于 2013-08-12T11:42:45.217 回答