0

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

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

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

这显然破坏了 & 给我们 /search/results/Takeaway+Foods/Inverchorachan,+Argyll 的 url,然后给出 404 错误,因为没有这样的页面。

url 保存在 $_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 添加这个时,我正在修剪下划线。不知道为什么,但对此的任何帮助都会很棒。

4

3 回答 3

2

你在一旁说:

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

简短的回答:不要这样做。

说真的,不要在 URL 中以这种方式使用 & 符号。即使长得漂亮。和号在 URL 中具有特殊含义,并且因为看起来不错而试图覆盖该含义是一个非常糟糕的主意。

大多数基于 Web 的软件(包括 Apache、PHP 和所有浏览器)都会对 URL 中的 & 符号的含义做出假设,您会发现很难解决。

特别是,如果你在 URL 中有任意的 & 符号,你会完全混淆谷歌和其他搜索引擎,所以它会完全破坏你的 SEO 排名。

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

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

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

于 2013-02-14T12:08:21.477 回答
0

看看urlencode

您还可以将“&”字符替换为不破坏 URI 的字符,并且不会像“|”那样被 apache 解释 字符。

于 2013-02-14T10:31:30.147 回答
0

我们已经修复了两周,所以我相信这已经解决了这个问题。我希望这会帮助有类似问题的人,因为我搜索了数周来寻找 apache 升级之外的解决方案以包含 B 标志。我们的用户现在可以输入床和早餐,然后我们可以提供相应的页面。

这是PHP中的修复程序。

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

if($newurl!='') $url=$newurl;
于 2013-02-19T14:55:45.890 回答