2011-10-30 90 views
1

我正在運行一個SocialEngine PHP應用程序,我最近已經遷移到另一臺服務器。PHP區分大小寫的路徑問題

而且,從這一點上 - 出現問題時:

的SocialEngine的核心努力包括在不區分大小寫的路徑文件, 這似乎不存在(雖然,在右邊的情況下,他們確實存在)

如何讓PHP/Apache的行爲更好,並在其他情況下搜索?

例如,SocialEngine查找/application/modules/Menuitems.php, ,正確的路徑是/application/modules/Menu**I**tems.php

總結:我想要不區分大小寫的路徑!

+4

歡迎來到SO。請參閱常見問題解答,瞭解需要問什麼類型的問題。只是因爲你想要的東西並不意味着你有一個問題。其次,你需要自己做一些基本的東西,例如獲取關於您將應用程序複製到的服務器操作系統的計算機課程,以瞭解更多信息。 – hakre

+0

之前你是在Windows服務器上還是什麼?幾乎每個* nix系統上的路徑都區分大小寫。 – Amber

+0

如果您已經從Windows主機遷移到Linux主機,您可能會失敗。它是解析這些文件路徑的操作系統,而不是PHP,通常,非Win文件路徑是區分大小寫的。 –

回答

4

在Windows中,您有不區分大小寫的路徑。但是當你將你的頁面移動到linux路徑時將會區分大小寫。您可以爲構建路徑創建函數,將所有字母轉換爲大寫或小寫(通常是首選),並將這些規範化的命名樣式之一用於目錄名和文件名。

+0

值得記住的重要評論,尤其是在將文件從Windows移動到Linux時! –

0

您可以嘗試使用此代碼,我只剩下幾個TODO步驟(對不起!沒有時間了,而且它太大了,無法將其作爲註釋)完成。你把這段代碼放在index.php文件的開頭,每次包含失敗時調用正確的文件名。

你必須單獨測試它,因爲它從php返回的警告中獲取文件名。我的PHP版本在括號中返回文件名不知道你的。測試代碼以瞭解它的工作原理。

<?PHP 
/*****************put this at the very top*********************************/ 
$flag=2; 
function correctFileName($incorrectFileName) 
{ 
    //directory and file to look at/for 
    $dirToLookAt = dirname($incorrectFileName); 
    $fileToLookFor = basename($incorrectFileName); 

    //get all .php files 
    $files = array(); $directory = opendir($dirToLookAt); 
    while($item = readdir($directory)) 
     if(is_string(strstr($item,'.php'))) 
      $files[] = $item; 

    //to do 
    /* 
    loop through the $files array and to 
    a case insensitive search for $incorrectFileName 

    if you find one then rename the file you found to $incorrectFileName 

    then break the loop 
    */ 

} 
//error handler function 
function customError($errno, $errstr) 
    { 
     global $flag; 
     //find the file name 
     if($errno==2 and (($flag%2)==0)) 
     { 
       //this will allow to enter only once per time 
       $flag++; 
       //get the file name 
      $start = strpos($errstr, '(') +1;//7 
      $length = strpos($errstr, ')') - $start ;//10 
      correctFileName(substr($errstr, $start ,$length)); 
     } 
    } 

//set error handler 
set_error_handler("customError"); 
/*****************************************************************/ 

//trigger error 
include 'c:\www\home\122221.php'; 
?> 

此外,代碼假定目錄部分名稱是正確的!否則你也必須這樣做。

0

前面已經談到的意見(我很抱歉,如果您覺得冒犯,並不意味着這種方式),並the one given answer有一個根本性的問題:

應用程序正在使用的文件名是無效的。他們不在你的Windows系統上,但他們在Linux上。

這很難解決。不過,我有以下想法:PHP StreamWrapper

流包裝在文件名和底層代碼之間互操作。它們能夠使用相同的界面訪問URL和文件,例如includefile_get_contents

通常,流的類型(並且您可以在其上註冊自己的包裝)以protocol://之類的內容開始。

如果沒有協議給出,它是file://

所以你可以嘗試的是創建你自己的流包裝registersfile://協議。然後,您可以處理區分大小寫的問題。

本手冊提供了一個pre-made definition of a stream-wrapper-class您可能需要重新使用。

其他人已經給出了提示和代碼如何解決大小寫敏感問題。您通常只需要處理您的案例中的讀取操作。