首页 > 解决方案 > httpd 禁止访问不是在 /var/www/html/ 中创建的文件

问题描述

我正在玩网络服务器,遇到了一个特殊的问题。我有一个全新的 Centos7 httpd (Apache) 网络服务器。

如果运行此序列:

sudo vi /var/www/html/ first.html
# enter "<p>hello</p>" and save

并按预期工作并在浏览器中{IP Address}/first.html显示“你好”。但是当我这样做时:

sudo vi /home/centos/second.html
# enter "<p>hello</p>" and save
sudo mv /home/centos/second.html /var/www/html/second.html

并点击{IP Address}/second.html它返回 403Forbidden You don't have permission to access/second.html on this server.

ls -al以此作为输出执行:

-rw-r--r--. 1 root root 13 Aug 18 23:33 first.html
-rw-r--r--. 1 root root 13 Aug 18 23:34 second.html

我执行了十六进制转储以确认以下输出的每一位都相同:

[centos@ip-172-31-10-192 html]$ hexdump -C first.html 
00000000  3c 70 3e 68 65 6c 6c 6f  3c 2f 70 3e 0a           |<p>hello</p>.|
0000000d
[centos@ip-172-31-10-192 html]$ hexdump -C second.html 
00000000  3c 70 3e 68 65 6c 6c 6f  3c 2f 70 3e 0a           |<p>hello</p>.|
0000000d

如您所见,文件本身没有差异。现在,我假设创建过程以某种方式编辑了一些允许访问的配置文件,first.htmlsecond.html我运行grep -rin "first" /etc/httpd/grep -rin "second" /etc/httpd/没有找到相关的输出。那么到底发生了什么?为什么通过vithen创建的 html 文件mv与通过 直接创建的相同文件的处理方式不同vi

标签: htmllinuxapachewebserver

解决方案


因此,在我按发送此问题但想将其传递给其他人之前,我找到了解决方案以及问题所在。

问题源于我曾经mv将现有文件移动到网络服务器而不是cp创建新文件的事实。

归功于https://forums.centos.org/viewtopic.php?t=6834上的 TrevorH 。

当您将某物从一个地方移动到另一个地方时,就会出现此问题。当你移动它时,它会保留原始的 selinux 上下文,所以如果你在 /home 或 /tmp 中解压某些东西,它会得到一个与其位置匹配的 selinux 上下文。现在您将其 mv 到 /var/www/html 并且它使用上下文说它属于 /tmp 或 /home 并且策略不允许 httpd 访问这些文件。

如果你 cp 文件而不是 mv 文件,selinux 上下文会根据你复制到的位置而不是它的来源来分配。运行 restorecon 会将上下文恢复为默认值并对其进行修复。


推荐阅读