Apache/2.4.18 (Ubuntu)
Ubuntu 16.04
这是我的 000-default.conf 文件:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName myserver.net
DocumentRoot /home/utils/rails/public
<Directory /home/utils/rails/public>
AllowOverride all
Options -MultiViews
Require all granted
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/myserver.net_error.log
CustomLog ${APACHE_LOG_DIR}/myserver.net_access.log combined
</VirtualHost>
/home/utils/rails/public 目录的文件设置设为 0755
我正进入(状态:
Forbidden
You don't have permission to access / on this server.
这是我第一次遇到这种情况。有什么想法吗?
答案1
- 他已经在答案中修复了目录/* 您自己的解决方案可能是最糟糕的建议。Directory 指令代表文件系统的目录。真正解决您的问题的方法是设置“AllowOverride 无“其中可能有一个恶意的 .htaccess 文件首先更改了您的权限。
将虚拟主机中的目录设置为文档根目录,如果您是管理员,请不要使用 .htaccess,因为如您所见,如果您不完全清楚自己在做什么,它会导致您感到困惑和错误,所以真正的答案是,将目录设置为文档根目录并设置 allowoverride none,控制虚拟主机内的访问,所有这些都集中在一个地方以便于检查。
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName myserver.net
DocumentRoot "/home/utils/rails/public"
<Directory "/home/utils/rails/public">
AllowOverride None
Require all granted
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/myserver.net_error.log
CustomLog ${APACHE_LOG_DIR}/myserver.net_access.log combined
</VirtualHost>
如果你想知道在哪里<Directory />
属于, 它属于在 服务器配置(或虚拟主机之外的全局配置) 和应设置为要求所有拒绝。否则,您实际上是在向所有人授予整个文件系统的访问权限。
我还删除了 mod_negotation 的 IfModule,因为禁用多视图与没有多视图是一样的,所以使用 Ifmodule mod_negotiation 禁用多视图没有多意义。
答案2
以下内容解决了该问题:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName myserver.net
DocumentRoot "/home/utils/rails/public"
<Directory "/home/utils/rails/public">
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
AllowOverride None
Require all granted
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/myserver.net_error.log
CustomLog ${APACHE_LOG_DIR}/myserver.net_access.log combined
</VirtualHost>
关键是:
Require all granted
这是从 Apache 2.4 开始使用的。其他指令不是访问问题的关键,但我用它们来禁止 .htaccess 指令(允许覆盖)并处理多视图
将权限设置为 0755 有效,不需要更改
*修复目录路径未复制的拼写错误