Проблема с паролем, чувствительная к PHP

Я запускаю приложение SocialEngine PHP, которое недавно перенесло на другой сервер.

И с этого момента – возникает проблема:

Ядро SocialEngine пытается включить файлы в нечувствительные к регистру пути, которые, как представляется, не существуют (хотя в правильном случае они существуют)

Как я могу заставить PHP / Apache действовать лучше, а также искать в других случаях?

Например, SocialEngine ищет /application/modules/Menuitems.php , а правильный путь/application/modules/Menu**I**tems.php .

Подводя итог: я хочу нечувствительные к регистру пути!

У вас есть незаметные пути в окнах. Но когда вы перемещаете свою страницу на linux-путь, регистр будет чувствителен к регистру. Вы можете создать функцию для пути построения, которая преобразует все буквы в верхний или нижний регистр (часто это предпочтительнее) и используйте один из этих нормализованных стилей именования для имен каталогов и файлов.

Вы можете поэкспериментировать с этим кодом. Я оставил только пару шагов 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'; ?> 

Также в коде делается предположение, что имя каталога верное! в противном случае вы тоже должны это сделать.

Как уже говорилось в комментариях (я сожалею, если вы оскорблены, не имел в виду именно так) выше, и один из ответов дал фундаментальную проблему:

Имена файлов, которые использует приложение, являются недопустимыми. Они не были в вашей системе Windows, но они на Linux.

Это трудно решить. Однако у меня была следующая идея: PHP StreamWrapper .

Обтекатели потоков взаимодействуют между именами файлов и базовым кодом. Они позволяют получать доступ к URL-адресам и файлам с одним и тем же интерфейсом, например include или file_get_contents .

Обычно тип потока (и на который вы можете зарегистрировать свою собственную оболочку) начинается с чего-то вроде protocol:// .

Если протокол не указан, это file:// .

Итак, вы можете попробовать создать собственную поточную оболочку, которая регистрируется в file:// protocol. Затем вы можете решить проблемы чувствительности к регистру.

В руководстве содержится предварительное определение класса stream-wrapper, который вы, возможно, захотите повторно использовать.

Другие дали подсказки и код, как решить проблемы чувствительности к регистру. Обычно вам нужно иметь дело с операциями чтения в вашем случае.