Я создал простой скрипт загрузки в php, который берет файл, отправленный из формы, и помещает его в нужный каталог. Проблема в том, что по какой-то причине при попытке показать этот файл в браузере сервер отвечает сообщением 403 — Запрещено. Фактически я изменил сценарий, чтобы он сначала делал копию файла из папки tmp, а затем перемещал его с другим именем:
copy($_FILES['photo']['tmp_name'],$new_file_name);
move_uploaded_file($_FILES['photo']['tmp_name'], 'm_'.$new_file_name);
Поэтому, если я загружаю файл file.jpg, он создает файлы file.jpg (скопировано) и m_file.jpg (перемещено). На сервере оба файла находятся в одной папке и выглядят одинаково, с одинаковыми разрешениями, пользователь и группа, кроме того, что domain.com/file.jpg показывает изображение, а domain.com/m_file.jpg возвращает ошибку 403.
Если я отключу nginx и заставлю его работать с apache, все будет работать нормально. Я пересмотрел файлы конфигурации nginx, но в этом нет ничего странного (фактически используется конфигурация по умолчанию)
Обновить:
странно, кажется, что проблема проявляется только в конфигурациях, где версия PHP больше 5.3 и выполняется как «fpm-приложение, обслуживаемое nginx». Таким образом, он отлично работает с 5.3.3, но не работает с php 5.5 или 7, если вы не выполните его как «приложение fastCGI, обслуживаемое Apache».
Задача ещё не решена.
Других решений пока нет …