如何防止mod_rewrite接受输入错误的网址

时间:2013-04-05 14:27:36

标签: .htaccess mod-rewrite url-rewriting

首先,我查看了mod_rewrite - how to redirect a mistyped 'pretty' url然而OP希望他的错误输入的网址重定向到正确的,我只是想让我的错误404。

快速提问。我正在寻找一个解决方案来改进我的一些mod re_write代码。

目前,如果有人要在我的网站上输入一个产品页面的网址I.e. “/ products / [category] ​​/ [product-name]”.htaccess文件具有以下代码

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

哪种方式与预期完全一致,但如果有人输错了[product-name],模板页面仍会使用URL中的产品名称作为变量加载而不会出现404错误。

我处理所有错误页面:

#ErrorDocument 404          /index.php?page=error404

希望有人能够阐明如何调整以前的重写规则以便不存在的页面。如果我们有一个名为kettle的产品,并且有人在URL的末尾键入了ketle,那么它将是404而不是仍然使用ketle加载模板页面作为GET var。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我假设你是index.php脚本处理“页面”和“产品”参数。这将是唯一一个知道“产品”参数是否实际指向有效产品名称的人。如果没有,那么您需要使用header函数生成404,然后显示page=error404的内容。

htaccess文件和mod_rewrite不会知道页面名称是否正确或是否输入错误,只有查找的脚本才会知道。

答案 1 :(得分:1)

您甚至可以将PHP脚本编写到动态页面的< head> 元素中,并以此格式为例:

$con = mysqli_connect("$hostname", "$username", "$password", "$database");

if (mysqli_connect_errno()) {
    echo mysqli_connect_error();
}

$result = mysqli_query($con, "SELECT content FROM pages WHERE id = $value LIMIT 1");

if (0 = mysqli_fetch_array($result)) {
    echo '<meta http-equiv="location" content="URL=http://www.yourdomain.com/index.php?page=error404">';
}

注意:如果它是正确的,请仔细检查上面的代码,因为它只是一个示例,并没有很好地检查语法,如果 mysqli_fetch_array()用于计算行( s)在SQL查询的 $ result 上。