2010-02-09 48 views
7

解決:如何通過GET獲取URI來傳遞「/」?

此URI的工作原理:

/controller/action?ret=%2F 

我想一個額外的 「/」 參數傳遞給控制器​​動作。所以我這樣做:

$par1 = urlencode('/'); 
$this->_redirect('/controller/action/par1/' . $par1); 

但我收到此錯誤信息:

Not Found 

The requested URL /controller/action/ret// was not found on this server. 

當我調用控制器動作不帶任何參數或參數「AAA」它的工作原理。這些URI工作:

/controller/action 
/controller/action/par1/aaa 
/controller/action/par1/jfhsdajkhfui454fs 
/controller/action/par1 
/controller/action/par1/ 

你可以把http://example.com在上述所有相關URI的前面,它是相同的。

回答

9

你幾乎都這樣做的權利。唯一的一個小錯誤是,urlencode寧願使用加號來表示空格,這隻適用於查詢參數而不適用於路徑部分。 rawurlencode在這裏會更好。

但是,這不是它不起作用的原因。您已經生成路徑/controller/action/par1/%2F,這是正確的。

它在實踐中並不適用於你,因爲Apache正在試圖保護你(以一種相當無效的方式)避免目錄遍歷問題。如果您在URL路徑中包含%2F序列,Apache將默認跳入並顯示您自己的404頁面(忽略任何errordocument設置)。要關閉此功能(IMO:misfeature),您可以使用AllowEncodedSlashes配置指令。

當它回到腳本時,是否能夠實際檢索編碼的斜線是另一種蠕蟲。由於原始CGI規範中PATH_INFO變量的設計不合理,很多環境將無法將%2F看作與未編碼的/不同的東西,從而可能會破壞您從路徑部分進行的路由。

通常情況下,最好避免在路徑部分使用斜線,因爲Apache不是唯一會被他們困惑的服務器或語言。一般來說,您應該使用查詢參數來輸入需要能夠接受任何字節或字符串的輸入,因爲路徑部分在許多服務器中具有實際問題,其中(a)/,(b)\,(c)NUL字符和(d)空字符串。

+0

我真的設法解決這個通過使用這樣的URI:/控制器/行動?ret =%2F :) –

+0

非常豐富的答案,bobince。我不熟悉AllowEncodedSlashes配置選項,我自己。 –

2

嘗試%2F。我不認爲urlencode將編碼'/',因爲它是有效的URL語法。

[編輯]:讚賞票,但它似乎我的答案是不正確的。請參閱bobince的正確答案 以下的

+0

'urlencode'確實編碼了'/'。 – bobince