不知道从什么时候开始,wordpress媒体库不显示图片缩略图了。打开wordpress图片路径后,显示500内部服务器错误。这导致一些文章里的图片也无法显示。显然,这个错误由纯图片路径访问报错引起。
考虑到近期修改了主题function.php文件,所以回退了该文件到历史版本,错误没有修复。
随后发现只有近期上传的图片才出现此错误,几年前上传的图片没有错误。
一直没有想到解决办法,只能在服务器端使用详细错误页面查看错误信息,发现错误来自于url重写模块。
我禁用了wordpress伪静态规则,错误消失。但是该规则与纯图片url显然无关,不应该由该规则表示。
至此,问题无解,不使用url重写模块会导致伪静态失效,无法接受。
但此时突然想到,很久以前上传的图片可以正常显示,只有近期上传的才出现问题。因此我详细比较了两者文件的区别,发现图片文件权限设置不同。
虽然所有文件都给了IUSER读取权限,但是能正常访问的文件还给予了IIS_IUSERS的读取权限,报错文件没有此项权限。经测试,给予所有文件该项权限后,bug被修复,此错误根源不在于url重写模块,iis报错信息并无帮助。另外,设置EVERYONE可以访问和读写猜测应该也可以解决这个问题,但考虑到安全性,我原则上并不给予任何文件和文件夹everyone权限。
不知道为什么,新上传的文件权限设置会和之前上传的不同,我想我并没有修改过类似设置,我猜想会不会本地上传的文件本身的权限设置会影响对应云端文件的权限呢?而且iis报错为500错误,而不是权限相关的401/403错误,确实让人变得迷茫,让人误以为是php代码错误或者iis模块错误。
IUser,IIS_IUsers的区别:
IIS_IUSRS是Internet信息服务使用的内置组。
Network Configuration Operators组中的成员有部分管理权限来管理网络功能的配置。
IUser应该是来宾用户,由IIS自动生成。
随后,我查阅了一些文章,最终知道了问题出现的真正原因:我曾修改了php.ini中对临时文件夹的定义。下面是相关内容:
在Windows平台下如果PHP使用的是IIS的话那么php在上传文件时是先将文件上传到一个临时目录下的 (该配置项可以在php.ini的" upload_tmp_dir "里进行配置,由于我们的服务器并没有进行过配置 ,所以php将使用系统的临时目录"C:\Windows\Temp" )。 然后PHP再将临时目录中上传的文件再移动到你指定的目录中去,这样就存在一个问题,即Temp目录下默认的权限是没有相应的IIS访问权限的(windows默认配置),当文件上传到该目录时那么上传的文件默认是继承了Temp目录的权限,而PHP再将文件文件移到指定的目录时,被移动的文件并不会继承移动后所在的目录权限,从而导致从浏览器访问被移动的文件时,因为该文件没有相应的权限(IIS访问权限)而无法正常访问,也就出现了文件上传成功但浏览器访问时报错的问题。