Что-то заставляет nginx, php или phpbb (или что-то еще) добавить 1 байт в начало файлов аватаров, загруженных с phpbb. Это повредит файл.
Чтобы исключить внешние факторы, такие как Cloudflare, я теперь настроил phpbb как не-https, только localhost, сжатие отключено.
Проблема видна из следующего кода:
Получите файл с локального хоста — без кеширования или облака, чтобы помешать:
wget http://localhost/forum/download/file.php?avatar=4625_1413540046.jpg -O avatest_local.jpg
‘avatest_local.jpg’ saved [6419/6419]
Протестируйте файл
jpeginfo avatest_local.jpg
avatest_local.jpg Not a JPEG file: starts with 0x0a 0xff [ERROR]
Найдите идентичный файл (phpbb делает странные вещи с именами файлов)
find /var/www/forum/images/avatars/upload -size 6419c
/var/www/forum/images/avatars/upload2a36dc33069249d6b1187fd84d7fc957_4625.jpg
Протестируйте этот файл и найдите его хорошим
jpeginfo /var/www/forum/images/avatars/upload/2a36dc33069249d6b1187fd84d7fc957_4625.jpg
./2a36dc33069249d6b1187fd84d7fc957_4625.jpg 80 x 80 24bit JFIF N 6419
Изучите первые несколько байтов исходного файла:
xdd /var/www/forum/images/avatars/upload/2a36dc33069249d6b1187fd84d7fc957_4625.jpg
0000000: ffd8 ffe0 0010 4a46 4946 0001 0101 013a ......JFIF.....:
0000010: 013a 0000 ffed 0036 5068 6f74 6f73 686f .:.....6Photosho
0000020: 7020 332e 3000 3842 494d 0404 0000 0000 p 3.0.8BIM......
Изучите первые несколько байтов загруженного файла и увидите дополнительный бит:
xdd avatest_local.jpg
0000000: 0aff d8ff e000 104a 4649 4600 0101 0101 .......JFIF.....
0000010: 3a01 3a00 00ff ed00 3650 686f 746f 7368 :.:.....6Photosh
0000020: 6f70 2033 2e30 0038 4249 4d04 0400 0000 op 3.0.8BIM...
Удалите первый бит из загруженного файла, чтобы доказать это:
tail -c +2 avatest_local.jpg > avatest_fixed.jpg
jpeginfo avatest_fixed.jpg
avatest_fixed.jpg 80 x 80 24bit JFIF N 6418
Может или не может иметь значение, но если я использую инспектор средства просмотра заголовков Chrome, заголовки ответов http для аватаров показывают следующее:
content-disposition inline; filename=4625.jpg
Но если я использую Redbot, он показывает:
Content-Disposition: inline; filename*=UTF-8''4625.jpg
и предупреждает, что
Заголовок Content-Disposition не имеет параметра «имя файла».
Тем не менее, на официальной платформе phpbb заголовки размещения контента выглядят корректно, хотя, как вы можете видеть ниже, это, похоже, не влияет на другие способы просмотра изображения.
При загрузке или просмотре аватара в формате /download/file.php?avatar=4625_1413540046.jpg
в файл добавляется один байт, что делает его недействительным.
При просмотре изображения вроде /download/file.php?id=2871
изображение полностью корректно и отображается ОК.
Все файлы изображений в настоящее время на сервере являются действительными.
Детали сервера:
nginx 1.9.4
PHP 5.6.4-4ubuntu6.3
phpbb 3.1.6
Linux 3.19.0-30-generic #34-Ubuntu SMP Fri Oct 2 22:07:32 UTC 2015 i686 i686 i686 GNU/Linux
Целый день был потрачен на это, и я и форум phpbb совершенно сбиты с толку. Только начало происходить с момента обновления до phpbb 3.1.6. Очевидно, что это уникальная проблема для меня. А может и нет?
Может быть, у вас есть пустая строка после?> В php файле? Это может быть причиной
Проверьте разрешения
https://www.phpbb.com/support/docs/en/3.0/kb/article/phpbb3-chmod-permissions/
chown -R forum:forum forum/
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
cd forum
chmod 777 cache store files images/avatars/upload/
Первая часть о chown -R forum: forum forum / — это то, что я всегда делаю после обновления, но chmod — это то, что я ДУМАЛ, что я делал давным-давно. Я не трогал эти каталоги, когда обновлял доску.
Интересно, обрабатывает ли 3.1.6 временные файлы и файлы кэша иначе, чем в предыдущих версиях? Все, что я могу думать, это то, что phpbb (или что-то в этом роде) пытается кэшировать ответ от получения аватара (?!), И когда он обнаруживает, что не может, он все равно отправляет файл, но с … дополнительным байтом ?!
Но это даже не имеет смысла. Совсем. Я не могу понять это вообще, но все, что я могу сказать, это то, что повторное выполнение всех разрешений исправило это.
Если кто-нибудь может объяснить, что могло бы произойти, я весь слух!
У меня была похожая проблема, оказалась пустая строка, случайно вставленная в начале config.php