Apache不允许加载除index.html之外的其他文件

时间:2017-07-23 20:34:08

标签: html apache http server http-status-code-403

在你提问之前,我试图搜索类似的问题,其中没有一个问题确切存在。
我是新手,我在运行Raspbian的RasPi上安装了Apache2,PHP5和MySQL5。 根据需要,我将index.html放在/var/www/html中,当我单独键入我的Pi的IP或后跟/index.html时,index.html正确运行其代码和所有元素出现。

问题:此外,我将我的JS和CSS文件放在同一个文件夹中,还有几张照片要显示。
浏览器彻底读取HTML,但不加载由此链接的JS和CSS文件,也不加载图像。 将文件放在子文件夹中也没有帮助。
当我输入IP后跟/style.css(我链接的CSS文件的名称)时,我得到 403 Forbidden 。错误日志也显示了这一点:

 file permissions deny server access: /var/www/html/photo.jpg, referer: http://192.168.178.120/
 access to /images/dark.jpg denied because search permissions are missing on a component of the path, referer: http://192.168.178.120/


我试过研究这个,但没有任何帮助。当我的JS和CSS在我的HTML中时,除了图像之外,一切正常
结论: Apache不允许浏览器加载index.html以外的文件。
你知道这个问题是什么吗?是否有一个特定的文件夹,我应该把我的其他文件?提前谢谢。

1 个答案:

答案 0 :(得分:1)

根据ls的结果,Apache无法访问您的文件。

简答:

  

运行以下两个命令:

     

find /var/www/html -type f -exec chmod 644 {} \;

     

find /var/www/html -type d -exec chmod 755 {} \;

更长的解释:

pi@raspberrypi:~ $ ls -l /var/www/html
total 2976
-rw------- 1 pi pi     60146 Jul 23 22:11 bnw.jpg
-rw------- 1 pi pi    202851 Jul 23 22:11 color.jpg
-rw------- 1 pi pi    617185 Jul 23 21:27 dark.jpg
-rw------- 1 pi pi   2028727 Jul 23 22:11 effect.jpg
drwx------ 2 pi pi      4096 Jul 23 21:33 images
-rw------- 1 pi pi      2238 Jul 23 22:11 index.css
-rw-r--r-- 1 pi root    1261 Jul 23 22:11 index.html
-rw------- 1 pi pi    108397 Jul 23 22:11 photo.jpg
-rw------- 1 pi pi       538 Jul 23 22:11 script.js
-rw------- 1 pi pi      2238 Jul 23 21:33 style.css

该行开头的符号具有以下含义:

d: indicates a directory
r: means the file/directory is readable
w: means the file/directory is writable
x: means the file/directory is executable

-: means none of the above apply

这些符号分组如下:

drwxrwxrwx
       ^^^ apply to all users on the system
    ^^^--- apply to all users in the group that owns the file
 ^^^------ apply to the user that owns the file

它所指的pi pi指的是文件的所有者:组pi中的用户pi。您的index.html文件是一个例外,因为它由组root拥有。

现在这不是很重要,除此之外你需要意识到Apache通常作为组www-data中的用户www-data运行。这在系统与系统之间略有不同,但这是最常见的。这意味着,为了使Apache能够访问文件,必须使www-data用户或www-data组(或两者)都可以使用该文件。

在您的情况下,文件归用户pi和组pi所有(index.html除外,它由组root拥有。不是那个用户,很可能不在这两个组中,这意味着必须正确设置"系统上所有用户的文件权限,以便Apache能够访问该文件。

如您所见,index.html设置为系统上所有用户都可读:

-rw-r--r-- 1 pi root    1261 Jul 23 22:11 index.html
       ^^^ all users on the system may read from this file, but may not write and may not execute the file
    ^^^--- all users in the group "root" may read from this file, but may not write and may not execute the file
 ^^^------ the user "pi" may read from and write to this file, but may not execute the file

所有其他文件,包括images目录,只能由" pi"用户:

-rw------- 1 pi pi   2028727 Jul 23 22:11 effect.jpg
       ^^^ all users on the system may not read from, write to or execute this file
    ^^^--- all users in the group "pi" may not read from, write to or execute this file
 ^^^------ the user "pi" may read from and write to this file, but may not execute it

因此,要让effect.jpg可供Apache使用,您需要将文件权限更改为:

-rw----r-- 1 pi pi   2028727 Jul 23 22:11 effect.jpg
       ^^^ all users on the system (including Apache) may read from this file

为此,您可以使用chmod命令。有两种方法可以翻转该权限:

  

chmod o+r effect.jpg

     

chmod 604 effect.jpg

chmod o+r表示"添加' r'允许其他用户使用'类别" (您使用u+rg+r更改用户或群组权限)。 chmod 604表示"将用户的权限设置为6,组为0,其他为4" - 数字是权限的二进制和:1(可执行),2(可写),4(可读)。

目录需要更多的工作:

drwx------ 2 pi pi      4096 Jul 23 21:33 images

要允许文件系统实际打开目录并读取其中的文件,对于尝试访问其内容的用户,它必须是可执行的。因此,为了允许Apache从该文件夹中读取任何文件,它需要具有以下权限:

drwx---r-x 2 pi pi      4096 Jul 23 21:33 images
       ^^^ all users on the system may read from this directory and execute it

为此,请使用相同的原则:

  

chmod o+rx images(其他用户,添加可读和可执行权限)

     

chmod 705 images(为所有者设置read(4)+ write(2)+ execute(1),为所有其他用户设置read(4)+ execute(1))

现在,虽然如果所有者和群组是相同的并不是绝对必要的,但最佳做法是确保该群组具有与"所有其他用户相同的权限。类别。因此,不是提供文件604-rw----r--)和文件夹705drwx---r-x),而是给他们644 {{{ 1}})和-rw-r--r--755)。如果您在多个开发人员需要能够修改文件的环境中工作,那么它们应该位于同一个用户组中,最佳做法是为该组授予与所有者相同的权限,因此{{1} (drwxr-xr-x)和644-rw-rw-r--)。

最后,您不希望手动更改所有文件权限。这个特别的项目似乎相对较小,但它仍然令人烦恼。幸运的是,我们可以使用775命令执行批量更新。

drwxrwxr-x将列出给定文件夹的完整内容,包括子文件夹,然后您可以对其进行过滤或执行操作。

  

find

这将列出find或所有常规文件子文件夹中的所有条目。

  

find /var/www/html -type f

这将列出/var/www/html或任何目录子文件夹中的所有条目。

我们可以使用find /var/www/html -type d告诉/var/www/html在找到的每个文件/文件夹上自动执行某个命令:

  

-exec

find是一个占位符,其中find /var/www/html -type f -exec chmod 644 {} \;将放置每个文件名。需要{}来通知find不会提供\;命令的其他参数,因此我们可以选择为find本身添加其他参数。

因此上面的命令将修复所有文件的权限,以下命令将修复所有文件夹的权限:

  

-exec

之后,Apache应该可以访问find中的所有文件和文件夹。请记住,每次在该文件夹中创建新文件时,都需要检查权限并在必要时进行修复。