php mkdir() chmod и разрешения

я использовал этот базовый скрипт:

$folderPath = "../path/to/$folder/";
mkdir("$folderPath");

я создаю этот каталог, а затем загружаю в него фотографии. Я делаю это уже 4-5 месяцев, и вдруг я начинаю получать ошибки «ЗАПРЕЩЕНО» при попытке просмотреть содержимое папки через веб-браузер.

Каталог создается так же, и фотографии по-прежнему загружаются без проблем, но я не могу получить доступ к фотографиям.

Я попытался переписать скрипт и использовать chmod для изменения разрешений, но мне совсем не повезло.

Все старые папки создавались с помощью: -w- rwx r-x r-x

и я не могу воссоздать это

Я попытался добавить строку chmod в свой скрипт:

$folderPath = "../sales/inventory/$folder/";
mkdir("$folderPath");
chmod("$folderPath", 0755);

но я не могу воссоздать те же разрешения, я пытаюсь понять, как работает chmod, но я не могу понять, как заставить эту очень простую функцию снова работать правильно


person Thomas    schedule 21.09.2010    source источник
comment
примите некоторые ответы, если хотите, чтобы люди помогли вам   -  person Galen    schedule 22.09.2010
comment
Этот код меня немного нервирует, вы очищаете/фильтруете $folder? Если нет, то это было бы моим первым предположением о том, почему он остановился, потенциальная брешь в системе безопасности.   -  person Jimithus    schedule 22.09.2010
comment
это не весь скрипт, у меня есть фильтры в $folder   -  person Thomas    schedule 22.09.2010
comment
Просто проверяю, так как это могло быть (или) проблемой. Вы проверяли фактические разрешения фотографий? Как будто у вас есть доступ к папке, которая является ее частью, фотографии также нуждаются в соответствующем разрешении.   -  person Jimithus    schedule 22.09.2010
comment
звучит как вещь провайдера, безопасный режим маловероятен, квота или, возможно, fastcgi + suexec, спросите при сбое сервера; представленный код не является причиной   -  person mario    schedule 22.09.2010
comment
Что возвращает chmod()? Если разрешения неверны, PHP может быть не в состоянии изменить разрешения; это будет отображаться как вызов chmod(), возвращающий FALSE. Сервер работает под управлением ОС типа Unix? Если это так, и если у вас есть доступ к оболочке или (S)FTP, сделайте список каталогов с разрешениями и покажите нам результат. (В оболочке выполните ls -la, находясь внутри каталога.)   -  person mr. w    schedule 22.09.2010


Ответы (4)


Попробуйте поискать файл HTAccess, где будет упомянута опция «Параметры-индексы», так как она в основном используется для того, чтобы не отображать содержимое папки в веб-браузере. Файл необходимо искать следующим образом: -

  • В папке "root_folder/sales/inventory/$folder/", где "$folder" указано в вашем коде.
  • Если не нашли, попробуйте в папке "корневая_папка/sales/inventory/".
  • Если не нашли, попробуйте в папке "корневая_папка/продажи/".
  • Если не нашли, попробуйте в папке "root_folder/".

Когда вы получите код «Опции -Индексы», записанный в файле HTAccess, вы можете удалить / прокомментировать эту строку кода оттуда, или вы также можете написать другой файл HTAccess в нужной вам папке «$folder», где код будет быть "Индексы опционов".

Также на странице PHP логика должна быть такой: -

<?php
$folderPath = "../sales/inventory/$folder/";
mkdir("$folderPath");
chmod("$folderPath", 0755);

// Use of "copy()" / "move_uploaded_file()" function here, using some "$targetFile" variable.
chmod($targetFile, 0755);
?>

Это поможет вам, когда вы будете отсоединять/удалять загруженные файлы из папки "$folder".

Надеюсь, поможет.

person Knowledge Craving    schedule 22.09.2010
comment
спасибо за помощь, это помогает, но у меня все еще есть проблема с фактическими разрешениями, отражающими то, что я подключаю к скрипту, например, ваш пример работает нормально, за исключением того, что когда я смотрю на разрешения из дерева каталогов, созданный $ папка не rwx rx rx, как и следовало ожидать, а вместо этого выходит как rwx rx --- - person Thomas; 22.09.2010
comment
если подумать, я только что перечитал то, что вы сказали, и, должно быть, я пропустил chmod в части загрузки файлов в конце, я попытался добавить это в сценарий загрузки, и он отлично работает. Я очень ценю помощь, кажется, все работает хорошо, но сейчас я просто не могу понять, почему это вообще сломалось. - person Thomas; 22.09.2010
comment
@thomas - Это обычная часть, которую я тоже делал неправильно, когда сам был первокурсником. Так что не о чем беспокоиться и взбодриться! Удачи!!! - person Knowledge Craving; 22.09.2010

Если ваша переменная $folder включает в себя некоторые подкаталоги, ваши родительские каталоги, возможно, не настроены на правильные разрешения. Это была проблема, с которой я столкнулся на арендованном сервере OVH Gentoo.

Представьте, что $folder = '/store1/ally23/shelf42'; ваша окончательная структура каталогов будет ../sales/inventory/store1/ally23/shelf42, и вы хотите 0777 разрешений. Вы делаете:

mkdir($folderPath, 0777, true) || chmod($folderPath, 0777);

Только последний каталог shelf42 изменен на 0777. Промежуточные каталоги создаются с разрешениями по умолчанию (в моем случае 0744).

В PHP-команде chmod нет рекурсивной опции, поэтому вам придется перебирать промежуточные каталоги и выполнять chmod по отдельности.

person quayph    schedule 13.06.2013

Если вы находитесь в общей среде, вы также можете chown после загрузки, на всякий случай. Особенно, если вы используете свой веб-сервер под пользователем, отличным от вашего виртуального хоста, имеет разрешение на доступ (например: «никто» против «мой сайт».) Это характерно для серверов cPanel, FWIW.

person Mark Mutti    schedule 18.09.2012

Просто umask означает разрешения по умолчанию для новых файлов/каталогов:

<?php
 umask(022);
?>

Это устанавливает разрешения по умолчанию для пользователя, группы и других соответственно:

  • 0 - читать, писать и выполнять
  • 1 - читать и писать
  • 2 - прочитать и выполнить
  • 3 - только чтение
  • 4 - написать и выполнить
  • 5 - только писать
  • 6 - выполнять только
  • 7 - нет разрешений
person Martin Zvarík    schedule 18.12.2020