查询字符串中的%26正在打破$ _GET部分

时间:2014-03-24 14:00:21

标签: php query-string

此页面

www.industrialstores.com/search_results/Bell+%26+Gossett+101238+1.25"+Sweat+ChecktroLFlangeset/46

我没有在$_GET['s']

中获得价值

$_GET['s']中的值应为Bell Gossett 101238 1.25" Sweat ChecktroLFlangeset,但只有Bell传递到$_GET['s']

我已尝试urldecode()htmlentities但未使用。

我的.httaccess文件就像

RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3 [L]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4 [L]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5 [L]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5&r=$6 [L]

2 个答案:

答案 0 :(得分:1)

正如Second Rikudo所写,你的重写规则不接受&字符(%26)。

试试这个;

RewriteRule ^([a-zA-Z0-9_-\&]{3,100})/([^/]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3 [L]
RewriteRule ^([a-zA-Z0-9_-\&]{3,100})/([^/]+)/([a-zA-Z0-9_\&]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4 [L]
RewriteRule ^([a-zA-Z0-9_-\&]{3,100})/([^/]+)/([a-zA-Z0-9_\&]+)/([a-zA-Z0-9_\&]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5 [L]
RewriteRule ^([a-zA-Z0-9_-\&]{3,100})/([^/]+)/([a-zA-Z0-9_\&]+)/([a-zA-Z0-9_\&]+)/([a-zA-Z0-9\&]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5&r=$6 [L]

此外,这些重写不是很有效。我会选择这样的东西;

RewriteRule ^(.*)$ index.php?route=$1 [L]

然后在PHP中完成所有匹配。有许多框架具有内置的优秀路由,您可以使用它来构建自己的,使用PHP中的explode()函数。

答案 1 :(得分:0)

问题不仅仅是& (amperstand)char是apache的一个特殊字符(它是separe参数)。因此,要识别这一点,请使用[B]标志(在您的情况下,在[L]之后附加它:

RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3 [L,B]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4 [L,B]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5 [L,B]
RewriteRule ^([a-zA-Z0-9_-]{3,100})/([^/]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3&p=$4&q=$5&r=$6 [L,B]

写规则有效,是匹配“s”参数的第二组:/([^ /] +)/,它可以替换为/.+/。我测试过,效果很好。

基于:htaccess rewrite rule with escaped ampersand in $_GET fails