如果某些目录权限不正确,phpbb 3.1.6 会生成损坏的头像
phpbb 3.1.6 generates corrupt avatars if some directory permissions are not correct
注意:已解决 - 请参阅下面的答案。问题留作参考。
某些原因导致 nginx 或 php 或 phpbb(或其他)在从 phpbb 下载的头像文件的开头添加 1 个字节。这会损坏文件。
为了排除 Cloudflare 等外部因素,我现在将 phpbb 设置为 non-https,仅限本地主机,关闭压缩。
问题可以从下面的代码看出:
从本地主机获取文件 - 无缓存或 cloudflare 干扰:
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 header 查看器检查器,头像的 http 响应 header 显示如下:
content-disposition inline; filename=4625.jpg
但是如果我使用redbot,它会显示:
Content-Disposition: inline; filename*=UTF-8''4625.jpg
并警告说
The Content-Disposition header doesn't have a 'filename' parameter.
然而,在官方phpbb board 上,content-disposition headers 似乎是正确的,尽管如下所示,这似乎并不影响其他方法查看图像。
总结:
当下载或查看 /download/file.php?avatar=4625_1413540046.jpg
格式的头像时,文件中会添加一个字节,使其无效。
当查看像/download/file.php?id=2871
这样的图像时,图像完全有效并且显示正常。
当前服务器上的所有图像文件均有效。
- 我在 "lint" 模式下有 运行 php,所有文件似乎都有效。
- 我已经尝试运行在non-https中将电路板设置为"localhost"以完全消除外部因素。
- 我已经禁用了所有扩展,甚至删除了它们的文件。
- 此板已通过删除所有核心文件并复制新文件来升级。
- Nginx 直接提供图像和其他文件非常好,同一服务器上的其他软件运行没问题。
服务器详细信息:
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
的开头不小心插入了一个空行
注意:已解决 - 请参阅下面的答案。问题留作参考。
某些原因导致 nginx 或 php 或 phpbb(或其他)在从 phpbb 下载的头像文件的开头添加 1 个字节。这会损坏文件。
为了排除 Cloudflare 等外部因素,我现在将 phpbb 设置为 non-https,仅限本地主机,关闭压缩。
问题可以从下面的代码看出:
从本地主机获取文件 - 无缓存或 cloudflare 干扰:
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 header 查看器检查器,头像的 http 响应 header 显示如下:
content-disposition inline; filename=4625.jpg
但是如果我使用redbot,它会显示:
Content-Disposition: inline; filename*=UTF-8''4625.jpg
并警告说
The Content-Disposition header doesn't have a 'filename' parameter.
然而,在官方phpbb board 上,content-disposition headers 似乎是正确的,尽管如下所示,这似乎并不影响其他方法查看图像。
总结:
当下载或查看
/download/file.php?avatar=4625_1413540046.jpg
格式的头像时,文件中会添加一个字节,使其无效。当查看像
/download/file.php?id=2871
这样的图像时,图像完全有效并且显示正常。当前服务器上的所有图像文件均有效。
- 我在 "lint" 模式下有 运行 php,所有文件似乎都有效。
- 我已经尝试运行在non-https中将电路板设置为"localhost"以完全消除外部因素。
- 我已经禁用了所有扩展,甚至删除了它们的文件。
- 此板已通过删除所有核心文件并复制新文件来升级。
- Nginx 直接提供图像和其他文件非常好,同一服务器上的其他软件运行没问题。
服务器详细信息:
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
的开头不小心插入了一个空行