【问题标题】:How to prevent mod_rewrite from accepting a mistyped url [closed]如何防止 mod_rewrite 接受输入错误的 url [关闭]
【发布时间】:2013-04-06 03:48:18
【问题描述】:

首先,我查看了mod_rewrite - how to redirect a mistyped 'pretty' url,但是 OP 希望他输入错误的 URL 重定向到正确的,我只是希望我的到 error404。

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

目前,如果有人要在我的网站上输入一个作为产品页面的 URL,即"/products/[category]/[product-name]" .htaccess 文件有如下代码

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

这完全符合预期,但是如果有人仅输入错误的 [产品名称],模板页面仍会使用 URL 中的产品名称作为变量加载,并且不会出现 404 错误。

我这样处理所有错误页面:

#ErrorDocument 404          /index.php?page=error404

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

提前致谢。

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您甚至可以在动态页面的 元素中编写 PHP 脚本,以这种格式为例:

      $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 上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-13
        • 2011-06-16
        • 1970-01-01
        • 2011-11-30
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多