2015-06-10 43 views
0

有一個虛擬示例PHP應用程序,它顯示了導致我出現問題的原因。
PHP - urlencoded()&符號被認爲是實際&符號

<?PHP 
echo ((isset($_GET['P'])) ? print_r($_GET) : "<a href='http://example.com/a.php?P=" . urlencode('One & Two') . "'>One & Two</a>"); 

?> 


如果我們瀏覽網頁,而不P參數頁面將輸出:
http://example.com/One+%26+Two
這很好,但如果我們訪問鏈接,腳本將返回:

Array 

    (
     [P] => One 
     [Two] => 
    ) 

而且這顯然是錯誤的。
在實際應用中,url中提交了大約30個字符長的包含特殊字母(瑞典語)的字母數字字符串。
編輯:在我的實際應用中我使用URL重寫:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^(.*)$ ../example.php?s=$1 [L,QSA] 
</IfModule> 

可以是這樣的原因是什麼? - 確認。這是問題。請參閱下面的答案。

回答

1

您需要使用%發送您的網址以逃避&符。 嘗試像這樣'One %26 Two'

<?PHP 
echo ((isset($_GET['P'])) ? print_r($_GET) : "<a href='http://example.com/a.php?P=One %26 Two'>One & Two</a>"); 
?> 
+0

因此,我應該逃避通過urlencode逃脫的&符號?你甚至讀過完整的問題嗎? 無論如何,謝謝。 – xZero

+0

你從來沒有說過你正在使用重寫。如果用% –

+0

轉義它,你不需要使用urlencode這是一個巨大的項目,並且在兩個月前添加了url重寫,當項目啓動時,所以我完全忘了它。 在實際的應用程序中,URL中編碼比在示例中要多得多,所以手動編碼不是一種選擇。 – xZero

0

你可以按照你的this.if陣列就是這樣

$data = array('p'=>'one', 
      'q'=>'two'); 

,您可以建立網址這樣

echo http_build_query($data) 

它會給輸出這樣

p=one&q=two 
+0

感謝的答覆,但如何準確的答案解決我的問題? – xZero

+0

首先使用鍵和值創建一個數組,然後使用http_build_query()將該數組創建爲url。 –

+0

而且?你剛剛告訴我建立網址查詢的方式,我已經知道,但是爲了簡單起見沒有用在例子中。問題不在於URL編碼,而在於PHP-s看到URL編碼字符串。 – xZero

0

我發現這個問題。問題是擺脫PHP的權力。
這是問題,URL重寫:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^(.*)$ ../example.php?s=$1 [L,QSA] 
</IfModule> 

新的工作版本:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^(.*)$ ../example.php?s=$1 [B,L,QSA] 
</IfModule> 

參考:data being stripped off after ampersand in URL even when using urlencode

+1

'B'標誌正確地轉義了URL,所以變成'%26',這就是我說的手動操作。但是,您的重寫規則不是您原始問題的一部分。所以是的,我讀過它。 –

+0

但是,手動操作並不是真正的應用程序中的解決方案,它需要編碼更多的東西。 – xZero

+1

我明白了,如果原先給出的重寫規則可能已經給出了正確的答案。祝你的程序好運。 –