树莓派LAMP网站跨目录显示USB存储图片问题咨询
咱们先直接回答你的第一个问题:这个问题大概率和权限有关,但也可能涉及Apache的安全访问限制配置,下面咱们一步步拆解排查:
一、先揪出权限的潜在问题
Linux下访问文件有两个核心要求:一是文件本身得有读权限,二是通往文件的所有父目录都得有执行权限(x)——这个执行权限是用来让用户遍历进入目录的,很多人容易忽略这点。你现在只调整了newdir2和newdir4的权限,但还得检查这些路径的权限:
/disk:得给www-data(Apache的运行用户)加执行权限,不然连USB挂载的根目录都进不去/disk/newdir3:同样需要执行权限- 图片文件
/disk/newdir3/newdir4/picture.png:得给www-data加读权限
你可以直接执行这些命令来修复:
# 给所有父目录添加www-data组的执行权限 sudo chmod g+x /disk /disk/newdir3 /disk/newdir3/newdir4 # 给图片文件添加www-data组的读权限 sudo chmod g+r /disk/newdir3/newdir4/picture.png # 如果这些目录/文件的组不是www-data,得先把组改过来 sudo chgrp www-data /disk /disk/newdir3 /disk/newdir3/newdir4 /disk/newdir3/newdir4/picture.png
另外还要注意USB挂载的默认权限:有些USB设备挂载时默认是root独占权限,你可以用mount命令查看/disk的挂载参数,如果看到uid=root或者gid=root,就得修改挂载配置(/etc/fstab),让挂载后的目录权限对www-data开放。比如把fstab里的对应挂载行改成这样:
/dev/sda1 /disk ext4 defaults,gid=www-data,umask=002 0 2
改完后执行sudo mount -a重新挂载就行。
二、排查Apache的访问限制
如果权限都调对了,但图片还是加载不出来,那十有八九是Apache的安全配置在搞鬼——默认情况下,Apache只允许访问DocumentRoot(网站根目录)范围内的文件,你的图片在/disk目录,属于网站根目录外的内容,Apache会直接拒绝访问。
这时候得给Apache开个“特例”:
- 打开Apache的主配置文件或者你的站点配置文件(比如
sudo nano /etc/apache2/sites-available/你的站点.conf) - 添加这段配置,允许Apache访问图片所在的目录:
<Directory /disk/newdir3/newdir4/> Options FollowSymLinks AllowOverride None Require all granted </Directory>
- 更省心的办法是给图片目录建一个Alias(别名),这样你不用写长长的相对路径,直接用简洁的URL引用:
Alias /site-images/ /disk/newdir3/newdir4/
之后在index.html里直接写<img src="/site-images/picture.png" alt="picture" id="someid" />就行,比相对路径靠谱多了。
4. 最后重启Apache让配置生效:sudo systemctl restart apache2
三、快速验证权限是否真的没问题
你可以模拟Apache的运行用户(www-data)来测试能不能访问图片,执行这个命令:
sudo -u www-data cat /disk/newdir3/newdir4/picture.png
如果能输出一堆乱码(图片的二进制内容),说明权限完全没问题;如果提示Permission denied,那还是权限的锅,回去再检查父目录的执行权限。
内容的提问来源于stack exchange,提问作者Falk

