我现在已经两天苦苦挣扎了。
目前我有以下重写规则:
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']);
答案 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的一部分输出时处理它。