我遇到了文件权限问题,这让我很抓狂。我有一个 Perl Web 应用程序,它会自行安装、复制一些文件、创建数据库等等。除了一些图像文件外,其他一切都运行正常。Apache 无法访问这些图像:
(13) Permission denied: access to /path/to/image.gif denied
但是,文件是 644。我尝试过 chmod 777,并将 chown 改为 Apache 用户,但没有得到积极的结果。
让我抓狂的是:如果我复制文件,然后重命名旧文件并重命名新文件,它就可以起作用了!
mv image.gif image.gif.bak
cp image.gif.bak image.gif
文件相同、大小相同、权限相同、所有者和组相同。我可以在图像查看器中看到它们。但是,如果我恢复原始文件(删除“新”文件并将“旧”文件重命名为其原始名称),我再次收到“权限被拒绝”:
rm image.gif
mv image.gif.bak image.gif
所有图像文件都会出现此问题,但文本文件(静态 html、css……)不会出现此问题。
什么原因导致了这种奇怪的行为?
我在 CentOs 5.5 下使用 Apache 2.2.3。Perl 脚本(Perl 5.8.8)使用 Suexec 运行。
答案1
我怀疑可能是 SELinux 导致了问题?禁用它,然后看看一切是否正常工作:
su -
/sbin/setenforce 0
如果禁用后一切正常,请尝试restorecon
重新启用 SELinux,看看您的 SELinux 上下文是否被搞乱了。
答案2
听起来你确实有权限问题,因为
- 使用
suexec
,意味着 CGI 脚本和 Apache 不能在同一个用户/组下运行 - 我没有在你的描述中看到你检查了图像文件的路径,而不仅仅是文件本身
suexec
脚本将在其所有者用户和组下执行。Apache 本身将使用 httpd.conf(或 apache[2].conf、conf.d/...)中定义的自己的用户/组继续加载文件。
- 执行
ls -d
路径目录直至图像文件,以确保 Apache 至少具有--x
访问权限(无视图,但可以访问命名文件)。 - 您可以通过将组更改为 Apache 组(
Group
在配置文件中搜索)chgrp apache-group directory
并添加x
对同一目录的访问权限,从而授予 Apache 访问目录的权限chmod g+x directory
。
答案3
您在 apache 设置中为图像文件设置了 mime 类型吗?您可以在查看的目录中执行命令 ls -l 并将输出粘贴到这里吗?