在漂亮的URL中使用&符号中断URL

时间:2013-02-14 10:25:08

标签: php mod-rewrite ampersand

我见过很多人遇到这个问题,似乎停止apache处理编码的&符号和URL&符号的唯一方法是使用mod重写B标志,RewriteRule ^(。*)$ index.php?path = $ 1 [L,QSA,B]。

但是,这在早期版本的apache中不可用,必须安装,某些托管公司也不支持。

我找到了一个适合我们的解决方案。我们有/ search / results / Takeaway + Foods / Inverchorachan,+ Argyll +& + Bute +

的网址

这显然打破了&给我们/搜索/结果/外卖+食品/ Inverchorachan,+ Argyll然后给出404错误,因为没有这样的页面。

网址保存在$ _GET ['url']数组中。如果找到&它为每个&符号分割数组。

以下代码通过遍历每个部分的$ _GET数组将URL重新组合在一起。

我想知道这是否有任何我可能不知道的隐藏问题。

代码:

    $newurl = "";
    foreach($_GET as $key=>$pcs) {
        if($newurl=="")
            $newurl = $pcs;
        else
            $newurl .= "& ".rtrim($key,"_");
    }
    //echo $newurl;exit;
    if($newurl!='') $url=$newurl;

我正在修补下划线,因为apache添加了这个。不知道为什么,但对此的任何帮助都会很棒。

3 个答案:

答案 0 :(得分:2)

你在谈话中说:

  

我们希望URL显示&符号,因此不能替换其他字符。

简短回答:不要这样做。

说真的,不要在URL中使用&符号。即使看起来很漂亮。 &符号在URL中具有特殊含义,并试图覆盖该含义,因为它看起来不错是非常坏主意。

大多数基于网络的软件(包括Apache,PHP和所有浏览器)都会假设一个&符号在URL中的含义,你会发现很难解决这个问题。

特别是,如果你在网址中有任意的&符号,你会完全混淆谷歌和其他搜索引擎,所以它会完全破坏你的搜索引擎优化等级。

如果您的字符串中必须有&符号,请使用urlencoding将其转换为适合网址的%26。这在用户的URL字符串中看起来不太好,但它可以按预期工作。

如果这是不可接受的,那么用不同的替代品替换&符号;可能是单词"和",或者是字符和下划线,或者只是将其从字符串中删除而无需替换。

所有这些都是常见做法。试图强制URL在其中包含一个实际的&符号并不常见,并且有很好的理由。

答案 1 :(得分:0)

看看urlencode

您也可以替换“&”带有不破坏URI的字符的char,不会被像“|”这样的apache解释炭。

答案 2 :(得分:0)

我们已经将此修复程序安装了两周,所以我相信这已经解决了这个问题。我希望这能帮助那些遇到类似问题的人,因为我在几周内搜索了一个apache升级之外的解决方案,包括B标志。我们的用户现在可以输入Bed&早餐,然后我们可以提供相应的页面。

这是PHP中的修复。

$newurl = "";
foreach($_GET as $key=>$pcs) 
{
    if($newurl=="")
        $newurl = $pcs;
    else
        $newurl .= "& ".rtrim($key,"_");
}

if($newurl!='') $url=$newurl;