对我的站点执行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);
}
更好。谢谢你的代码,它确实显示了正确的内容,但是使用'include'函数只是增加了已存在页面中的文件内容。基本上有2页内1.任何想法? – zealisreal
是的,的确,'include'会在你的页面内容后显示来自'errors.php'的内容(即它不会取代你页面的内容)。 – anubhava
但是,您应该在PHP脚本开始时进行数据库查找,然后根据查询结果决定调用上面的include snippet和'exit;'从其余的PHP代码中解救出来。 – anubhava