在我的网站上实现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]
现在我很确定问题是由于我已经有了重写规则,所以我想我正在寻找的是重写的替代方案,它仍然允许我抓住任何新创建的页面网址但也允许成功的错误文档处理。
如果我遗漏了任何重要的代码/信息,请告诉我,我将用它编辑帖子。
提前感谢您提供任何建议/帮助。
EDIT ::
处理页面内容的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);
}
答案 0 :(得分: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
答案 1 :(得分:0)
只有使用.htaccess才能获得所需内容。
这是你如何处理这个:
RewriteRule
将请求的处理传递给index.php 你的.htaccess无法引发HTTP错误是不可能的,因为处理已经过了PHP脚本。