问题引入
阿里云服务器上的一个网站根目录:/var/www/testpublic
这个是通过配置基于端口的虚拟主机设置的站点根目录。里面的东西如截图所示。
昨晚我在该目录下增加了一个menu.html,而该静态网页引用了img目录下的一张图片。但是奇怪的是我通过浏览器访问,该图片并没有显示,打开浏览器控制台,看见该图片加载失败。
后来发现是权限问题!!!通过浏览器我可以访问js目录下的jQuery1.4.2.js,却不能访问img目录下的rightArrow.png。从截图上看可知是rightArrow的权限过小导致的。
在仔细分清楚其中的权限问题之前,我先来整理并记录一下有关权限的知识。
权限的基础知识
查看权限可通过命令:
ls -l
例:d rwx r-x r-x (注意,实际上没有空格,为了方便观察,我在中间加上了空格,原本应该是这样“drwxr-xr-x”)
一共有10位,
第1位:表示文件类型。d是目录文件,l是链接文件,-是普通文件,p是管道
其它位的字母含义:r是读(4),w是写(2),x是执行(1)。括号中是该权限对应的数值
后9位分为3段,每3位一段。
rwx:第2-4位表示这个文件的属主拥有的读、写、执行的权限。(这一段对应的数值:4+2+1=7)
r-x:第5-7位表示和这个文件属主所在同一个组的用户具有读和执行的权限。(这一段对应的数值:4+1=5)
r-x:第8-10位表示其他用户具有读和执行的权限。(这一段对应的数值:4+1=5)
所以权限“rwx r-x r-x”也对应数值755(可以说两者是等价的)。这个数值在通过命令修改权限的时候使用。
其他权限以此类推。
分析问题
apache httpd有默认的用户和组。它默认用户为apache,默认组为apache。
如何证实这一点?
查看当前正在运行的httpd服务:
ps -ef | grep httpd
同时还可以通过查看有关配置文件去验证:
vim /etc/passwd; vim /etc/group;
我们通过浏览器url访问图片,实际上是通过apache用户去读取这个图片。从截图上看这张图片属于root用户,属于root组。但是apache不属于root用户组,属于系统其他用户。就是说得看权限后9位的第3段,从截图看出来,apache什么权限都没有。所以我们自然无法通过url访问该图片。
解决问题
单单从解决这个问题的角度,只需修改一下图片的权限就可以了。
可以参照js目录下的jQuery1.4.2.js,将图片权限设置为:- rw- r-- r-- (644)即可
假设我现在处于/var/www/testpublic(网站根目录)下
chmod 644 img/rightArrow.png