.htaccess mod rewriterule和&符号

时间:2010-01-08 11:59:24

标签: php .htaccess arguments

我现在已经两天苦苦挣扎了。

目前我有以下重写规则:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L]

将example.com/后面的所有东西都作为GET变量u链接到index.php。这是在index.php中处理的,其中有一个爆炸来定义不同的参数:城市(在第一个斜杠之间)和位置(第二个参数)

这适用于以下网址:

example.com/City/location/或example.com/City/location
example.com/City/或example.com/City

产生:

$arg[0] = city
$arg[1] = location

当位置在位置名称中包含“&”符号时,会出现问题:

example.com/city/location&more

转换为:

index.php?u=city/location&more

问题很明显;我不能再使用index.php中的explode参数,因为位置名称的第二部分没有存储在$ _GET ['u']中。

我该如何解决这个问题?

我想到了三个我不知道如何实施的解决方案:
1)重写重写规则以分割.htaccess中的城市和位置 2)使用.htaccess等效的urlencode将& -sign转换为%26
3)完整的其他解决方案:)
Thanx提前!

修改 首先: 当链接由我的网站制作时,它会被urlencode翻译。所以没有&哪里不应该有一个。 &是商业名称的一部分:“Bagels& Beans” 当人们想要搜索他们输入的公司时:www.lample.com/city/bagels&beans在url-field中。 这就是问题开始的地方。

编辑2 当我去:example.com/city/bagels%26Beans 它转换为以下内容:$ _GET:

Array
(
    [u] => city/Bagels
    [Beans] => 
)

编辑3 我爆炸$ _GET ['u']来形成参数的方式。

$arg = explode('/',$_GET['u']);

4 个答案:

答案 0 :(得分:3)

您不需要将URL路径放在参数中。您可以简单地解析原始请求的路径,如下所示:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?');
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));

现在您只需要将此请求重写为 index.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ index.php [L]

附加条件是仅重写无法映射到现有文件的请求。

答案 1 :(得分:2)

首先要做的事情:

example.com/city/location&more

不是有效的查询字符串。您应该使用?开始查询字符串,如下所示:

example.com/city/location?more=value&more2=value2

其次,mod_rewrite中有一个修饰符,用于确保查询字符串被附加到新重写的URL,即QSA(意味着附加查询字符串)。您的重写规则如下:

RewriteRule ^(.*)$ index.php?u=$1 [NC,QSA,L]

答案 2 :(得分:2)

您可以尝试使用$ _SERVER [“REQUEST_URI”]而不是实际的$ _GET参数。

if(preg_match("%\?u=(.*)$%", $_SERVER["REQUEST_URI"], $Matches)) {
    $Test = explode("/", $Matches[1]);
    var_dump($Test);
}

对于“index.php?u = test / testlocation& more”,这将输出:

  

array(2){[0] => string(4)“test”[1] => string(17)“testlocation& more”}

答案 3 :(得分:0)

由于这个原因,您不应该将&作为网址的一部分。 &具有特殊含义,并且只要将其放入您网站上的%26标记中,就应该对其进行urlencoded(a),这样您就不应该看到& { URL中的{1}}。

基本上,我所说的是,不要在你的htaccess中处理这个问题,在任何错误的代码允许&作为URL的一部分输出时处理它。