html - 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.html
但second.html
我运行grep -rin "first" /etc/httpd/
并grep -rin "second" /etc/httpd/
没有找到相关的输出。那么到底发生了什么?为什么通过vi
then创建的 html 文件mv
与通过 直接创建的相同文件的处理方式不同vi
?
解决方案
因此,在我按发送此问题但想将其传递给其他人之前,我找到了解决方案以及问题所在。
问题源于我曾经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 会将上下文恢复为默认值并对其进行修复。
推荐阅读
- javascript - 使用 Javascript 部分在 HTML 模板中获取 Django 变量
- linux - 在 CentOS 上远程删除 docker 镜像的问题
- ruby-on-rails - Ruby 的 Stackdriver 错误报告,在 GKE 上运行
- python-3.x - 为什么 numpy.isrealobj('a string') 为真?
- c# - WPF datagrid 选择的行并将事件绑定到它
- c# - .NET 线程能否在方法返回和分配其返回值之间中断(不终止进程)?
- discord.js - (不和谐机器人)我如何让成员计数和机器人计数(加起来)显示在机器人雕像上
- javascript - 处理事件处理程序的最合乎逻辑的方式,当只有一次调用有效时,该处理程序被调用两次。
- mysql - 在存储过程中无法在 CASE WHEN 中更改 TABLE
- python-3.x - 交替元素