2013-02-14 20 views
0

我已經看到很多人有這個問題,它似乎是停止Apache處理編碼&符號和URL&符號的唯一方法是使用mod重寫B標誌,RewriteRule ^(。* )$ index.php?path = $ 1 [L,QSA,B]。在漂亮的URL中斷中使用&符號

但是,這在apache的早期版本中不可用,必須安裝,某些託管公司也不支持。

我找到了適合我們的解決方案。我們有/搜索/結果/外賣+食品/ Inverchorachan,+阿蓋爾一個url + & +弼+

這顯然打破了在&的URL給我們/搜索/結果/外賣+食品/ Inverchorachan,+阿蓋爾然後給因爲沒有這樣的頁面,所以出現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加入此。不知道爲什麼,但在這方面的任何幫助將是偉大的。

+0

可能已連接,但您應該在網址中轉義&。 – Joe 2013-02-14 10:27:53

回答

0

我們已經有兩週這個修補程序,所以我相信這已經解決了這個問題。我希望這可以幫助有類似問題的人,因爲我在尋找解決方案之外花了幾周的時間來尋找apache升級之外的解決方案以包含B標誌。我們的用戶現在可以輸入Bed &早餐,然後我們可以提供適當的頁面。

以下是PHP中的修復程序。

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

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

urlencode看看:

你也可以用一些替代「&」字符不打破URI並不會被Apache等解釋「|」焦炭。

+0

Apache仍然會打破已編碼的符號。我們希望網址顯示&符號,因此用其他字符代替不是一個選項。 – karmafunk 2013-02-14 10:36:51

+0

針對您的解決方案是使用瀏覽器歷史記錄並生成「假」網址,使用javascript截取它們並在提交到Web服務器之前對其進行轉換。 – robinef 2013-02-14 10:46:08

+0

robinef有個好主意,爲什麼不用'和'替換'&'的所有實例?將'bed&breakfast'改爲'bed and breakfast'可能不會刺激任何人。 – Josh 2013-07-22 19:56:22

2

您在cooment說:

我們想要的網址顯示的符號,以便與其他字符替換是不是一種選擇。

簡答:不要這樣做。

嚴重的是,不要在URL中以這種方式使用&符號。即使看起來很漂亮。 &符號在網址中有特殊含義,並試圖覆蓋該含義,因爲它看起來不錯,它不是一個好主意。

大多數基於網絡的軟件(包括Apache,PHP和所有瀏覽器)都會假定URL中的&符號含義,您會發現這很難解決。

尤其是,如果你在URL中有任意的&符號,你會完全迷惑谷歌和其他搜索引擎,所以它會徹底摧毀你的SEO排名。

如果您必須在字符串中包含&符號,請使用urlencoding將其轉換爲友好的URL %26。這在用戶的URL字符串中看起來不太好,但它會按預期工作。

如果這是不可接受的,那麼用一些不同的符號代替;也許是「和」這個詞,或者是一個像下劃線的字符,或者也許只是將它從字符串中刪除而不用替換。

所有這些都是常見的做法。試圖強制URL中包含實際符號字符並不常見,並且原因很好。

+0

這是超出我們的控制,因爲用戶將輸入牀和早餐,所以我們必須迎合它。當然,我們編碼它,但Apache仍然分裂它。我們現在已經解決了幾個星期,沒有問題,所以我相信這已經解決了。 – karmafunk 2013-02-19 14:52:27