2014-04-30 70 views
0

我一直在PHP中編寫一段時間,這是我第一次遇到這個問題。 我的目標是傳遞一個GET變量(一個url)而不需要對它進行編碼或解碼。這意味着「%2F」不會轉向「/」而相反。原因是我將這個變量傳遞給了第三方網站,可以放棄的必須保持原樣。強制GET變量(url)不被編碼

現在發生了什麼事情是這個URL(作爲GET變量傳遞):http://example.com/something%2Felse變成http://example.com/something/else

如何防止編碼GET中傳遞的內容?

+1

請提供您在這裏做什麼以及「PHP是如何編碼/解碼它」的完整演示。 – deceze

+0

你不能有一個URL的空間 – Steve

回答

3

由於安全原因,Apache拒絕路徑部分中包含%2F的所有URL:腳本通常無法(即不重寫)區分%2F和/由於PATH_INFO環境變量被自動URL解碼(這是愚蠢的,但是CGI規範的一個長期部分,所以沒有什麼可以做的)。

您可以關閉此功能使用AllowEncodedSlashes指令,但要注意,其他Web服務器仍然會禁止它(沒有其他選擇,把它們關掉),和其他字符,也可能是禁忌(如%5C)並且特別是%00將始終被Apache和IIS阻止。因此,如果您的應用程序依賴於能夠在路徑部分中使用%2F或其他字符,則會限制您的兼容性/部署選項。

我使用urlencode()處理,同時準備在搜索URL

您應該使用rawurlencode(),不進行urlencode()轉義路部分。 urlencode()的名稱是錯誤的,它實際上是針對應用程序/ x-www-form-urlencoded數據,例如查詢字符串或POST請求的主體,而不是URL的其他部分。

區別在於+不代表路徑部分的空間。 rawurlencode()將正確地生成%20,它可以在表單編碼的數據和URL的其他部分中使用。

+0

'utf8_decode'在這裏做什麼? – deceze

+0

@deceze檢查知道 – guelo

+0

感謝您的解釋。最終,我發現在將它傳遞到下一頁之前找到斜線並用temporeraly變量替換它(在我將該URL傳遞給第三方網站之前的相反動作) – user2298995

0

十六進制base16編碼它是HTTP協議的一部分,你不能防止它它否則它會打破實際的HTTP套接字請求到服務器。

用途:

請出示你是如何發送的URL第三方的實際例子。

因爲它應該閱讀http%3A%2F%2Fexample.com%2Fsomething%2Felse不只是像你的例子中的奇怪的%2F