处理无效的URL查询字符串

时间:2011-12-24 18:56:02

标签: php mod-rewrite

我已经解决了一个问题,并且不确定这是否是解决问题的地方。假设我有一个网址如下:http://localhost/products/1010/minprice/1/maxprice/100/

现在让我们说有人试图通过删除部分或全部变量名称产品minprice和maxprice来改变这个URL。无论如何都要检查以确保网址是有效的,如果变量已被更改,是否可以在重定向页面时将其删除?

我目前要检查网址,这只是另一个网址示例:

if(preg_match('#^/carsearch(.*/)?(manufacturer/([A-Za-z0-9\-%]+))(/.*)?$#',$uri,$tmatch))
        $return['manufacturer'] = $tmatch[3];

然后检查我的查询字符串变量:

if($_GET['manufacturer'] != null) {
$n .= 'manufacturer/'.$_GET['manufacturer'].'/';

}

使用新的$ n变量重新加载页面,该变量保存新的有效URL。 URL构建正常,但页面只是不断重新加载,你可以想象。我只是想知道,有更好的方法吗?我甚至不知道我是否走在正确的轨道上。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

if(isset($var))

检查变量是否为isset。您也可以执行类似

的操作
if(isset($var) && product_exists($productID))
   //accept
else
   //deny

无论你在做什么,这都是相同的原则。

答案 1 :(得分:0)

当您将参数传递给页面时,客户端始终可以更改它们(即使将数据作为表单POST传递,或者像在URL中一样传递数据)。 您应该使用验证过程,以确保URL的格式符合您的预期。 一种方法是使用正则表达式,例如:

if ( preg_match( "/^\/products\/\d+\/minprice\/\d+\/maxprice\/\d+\/$/", $url ) != 1 )
{
    echo( "Stop changing my URL!" );
}
else
{
    echo( "Thanks for not changing anything!" );
}

我看到你正在使用某种你没有指定的重写方法,所以你需要做的是在测试之前将请求路径的值放入变量$ url中。 正则表达式只是测试以下内容:

  1. 字符串的开头(^)
  2. / products /(/ products / - 向前和向后斜杠必须通过另一个反斜杠进行转义,因为斜杠是正则表达式语法的一部分。)
  3. 一个数字,最少一个(\ d +)
  4. / minprice /
  5. 位数
  6. / maxprice /
  7. 位数
  8. /
  9. 字符串($)的结尾,这意味着在sequenec之后没有别的东西可以出现。