2012-07-22 96 views
5

我有幾個電話is_dir在頁面上。他們一直沒有問題。PHP:open_basedir允許的路徑

幾天前,託管公司將PHP從5.2升級到5.3。從那時起,我對is_dir所有呼叫都導致了以下錯誤(消息):

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

這讓我爲難。

顯然,根據該錯誤消息(和php_info以及),目錄/home/virtual/domain.com(沒有尾隨斜線,所以包括子目錄)被包括/在open_basedir啓用,並且文件is_dir試圖遍歷全部位於該文件夾下的子文件夾中。那麼爲什麼他們不在允許的路徑之內呢?顯然他們是!

奇怪的是,這個錯誤出現只顯示當is_dir返回false,即,當文件一個文件夾,而是一個普通的文件。它似乎遍歷目錄沒有拋出錯誤。

以前發佈過的類似問題:Open_basedir restriction oddness(找不到解決方法)。

任何人有任何想法?

(注:更改PHP的設置是不是一種選擇,因爲這是一個共享的主機,我沒有任何管理權限)

+0

這是否是實際的錯誤消息?或者某些路徑中的某些特殊字符? – SteAp 2012-07-22 19:36:52

+0

有些路徑確實有一些特殊字符:'&'(&符號)和'_'(下劃線)。但即使對於不包含任何特殊字符的路徑(除非大寫字母被視爲特殊字符),也會出現錯誤。並且特殊字符都在目錄名稱中(並且在'is_dir'評估爲'TRUE'的情況下被正確解析和迭代),而不是在文件名稱中(這是發生錯誤的地方)。 – 2012-07-22 21:45:34

回答

4

PHP中存在一個未定義的錯誤,當您打開或檢查一個存在文件作爲前綴且不存在的部分作爲後綴的路徑時,會觸發該錯誤。在您的示例中,存在部分/home/virtual/domain.com/public_html/galleries/img/002.JPG而不存在後綴/(路徑中的斜線)。

有說明這不是一個錯誤:「這是預期的行爲。一個不存在的非路徑(帶有斜線的那個)被認爲是在basedir之外。「,但我不這麼認爲。如果路徑的第一部分是存在的文件,此錯誤只會觸發。

PHP錯誤:

3

原來答案是超級簡單,但完全不合邏輯:

當創建(連接)要遍歷的路徑時,我出於某種原因硬編碼了一個尾部斜線 - 注意上面的路徑如何以img/002.JPG/結尾,斜線在末尾。刪除這個斜線修復了錯誤。這也解釋了爲什麼它不會在目錄(應該有斜線),只有文件(不是)。

如果指定的路徑代表一個現有的目錄,按照PHP文檔的說法,is_dir()應返回TRUE;和FALSE在所有其他情況下,包括如果指定的文件不存在(其中img/002.JPG/不)。

所以我還是有點不解,爲什麼它不只是返回FALSE在PHP 5.2中使用的方式,而是讓這個相當深奧並坦言只是徹頭徹尾錯誤聲明該文件是不在允許的路徑內......但至少現在它再次運行。

相關問題