2010-01-08 191 views
2

我一直是这样,现在挣扎了两天。的.htaccess国防部重写规则和&

目前我有以下重写规则:

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

哪些端口一切背后example.com/到index.php作为GET变量u。这是在index.php中正在处理与爆炸以限定TE不同的参数是:连接的位置(第二个参数)

此完全适用于以下网址城市(第一斜线之间):

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

主要生产:

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

问题发生的要价较高时离子具有and符中的位置名称:

example.com/city/location&more 

转换为:

index.php?u=city/location&more 

的问题是显而易见的;我可以因为位置名称的第二部分没有存储在$ _GET [“U”]没有的index.php再使用爆炸参数。

我该如何解决这个问题?

我觉得三个解决方案,我不知道如何实现:
1)重写重写规则的城市和地点分开使用进行urlencode的的.htaccess相当于改造的.htaccess
2)在& -sign为%26
3)一个完整的其他解决办法:)
Thanx提前!

编辑 首先: 当链接是由我的网站产生的它被翻译用urlencode。所以不存在&那里不应该有一个。 的&是业务的一部分namen这样的:“百吉饼&豆” 当人们想搜索这家公司,他们键入:www.example.com/city/bagels &豆在URL字段。 ,这就是问题的开始。

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

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

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

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

你用于爆炸的PHP代码是什么? (你在爆炸?) – 2010-01-08 12:55:27

+0

我已经把它放在我的问题,在编辑3 – blub 2010-01-08 13:07:22

回答

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] 

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

0

因为这个原因,你不应该有&作为URL的一部分。&具有特殊含义,并且应该在您的网站上将其置于a标记中的任何时候进行urlencoded(至%26),以便您永远不要在URL中看到它实际上以&的身份出现。

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

+0

每次我从数据库中产生的名字我urlen代码到%26。但即便如此,它也会出错 - 请看看我的编辑 – blub 2010-01-08 12:46:08

2

首先第一件事情:

example.com/city/location&more 

是不是有效的查询字符串。你应该?开始查询字符串,像这样:

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

二是在mod_rewrite的改性剂,以确保查询字符串获得附加到新重写网址,这是QSA(意为追加查询字符串)。您的重写规则看起来像:

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

&符号是名称的一部分,而不是争论! – blub 2010-01-08 12:45:07

+0

@blub:在这种情况下,您必须对&符号进行编码。 – 2010-01-08 12:49:12

+0

看看我的第二次编辑:即使我编码到%26 GET变量出错。 – blub 2010-01-08 12:50:47

2

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

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

对于 “的index.php U =测试/ testlocation &更?” 这将输出:

阵列(2){[0] =>串(4) “试验”[1 ] => string(17)“testlocation & more”}