【问题标题】:Apache giving 403 forbidden errorsApache 给出 403 禁止错误
【发布时间】:2013-08-29 03:20:23
【问题描述】:

好的,所以我之前设置了两个虚拟主机,它们运行良好。它们都包含简单的 Web 项目,并且可以在浏览器中使用 http://project1http://project2

无论如何,我来添加另一个虚拟主机。我用 127.0.0.1 project3 编辑了 /etc/hosts 文件,还通过复制和粘贴 project2 的先前条目并编辑文件路径来更新 httpd-vhosts.conf 文件。

我已经检查了所有文件和文件夹的权限(实际上是我从 project2 复制和粘贴的),并在 index.php 文件中简单地添加了一条“hello world”消息。

访问http://project3时收到403禁止权限被拒绝消息

为什么会这样,我可以弄清楚我错过了哪一步,因为一切似乎都设置正确。

【问题讨论】:

  • 你重启了 Apache 吗?

标签: html apache vhosts


【解决方案1】:

检查:

  • Apache 可以物理访问文件(运行 apache 的用户,可能是 www-data 或 apache,可以访问文件系统中的文件)
  • Apache可以列出文件夹的内容(读取权限)
  • Apache 对该文件夹有一个“允许”指令。 /var/www/ 应该有一个,例如,您可以检查默认 vhost。

此外,您可以查看 error.log 文件(通常位于 /var/log/apache2/error.log),该文件将准确描述您收到 403 错误的原因。

最后,您可能需要重新启动 apache,以确保应用所有配置。 这通常可以通过/etc/init.d/apache2 restart 完成。在某些系统上,该脚本将被称为 httpd。想办法。

【讨论】:

  • 嗯,我得到“客户端被服务器配置拒绝”...任何线索?谢谢
  • 等一下!我想我明白了。我重新启动了 apachectl 并且似乎可以工作。不敢相信就这么简单。谢谢
  • 附加部分解决了我的问题,从错误日志中获取实际错误。
  • 我错过了允许指令。谢谢
  • 我没有看到上面提到的任何问题,但仍然出现错误。有趣的是,/var/log/apache2/error.log 文件只有两行。首先:“ [mpm_prefork:notice] [pid 2302]”等等。第二:“[core:notice] [pid 2302] AH00094: Command line:”等等。我还能去哪里看?
【解决方案2】:

经过几天的努力,我刚刚解决了这个问题。这对我有用:

首先,检查您的 Apache error_log 文件并查看最新的错误消息。

  • 如果它说的是:

    access to /mySite denied (filesystem path
    '/Users/myusername/Sites/mySite') because search permissions
    are missing on a component of the path
    

    那么你的文件权限有问题。您可以通过从终端运行以下命令来修复它们:

    $ cd /Users/myusername/Sites/mySite
    $ find . -type f -exec chmod 644 {} \;
    $ find . -type d -exec chmod 755 {} \;
    

    然后,刷新您的网站应位于的 URL(例如 http://localhost/mySite)。 如果您仍然收到 403 错误,并且您的 Apache error_log 仍然说同样的话,那么逐步向上移动您的目录树,并随时调整目录权限。您可以通过以下方式从终端执行此操作:

    $ cd ..
    $ chmod 755 mySite
    

    如有必要,请继续:

    $ cd ..
    $ chmod Sites 
    

    如果有必要,

    $ cd ..
    $ chmod myusername
    

    不要走得更远。你可能会彻底搞砸你的系统。 如果您仍然收到search permissions are missing on a component of the path 的错误消息,我不知道您应该怎么做。但是,我遇到了一个不同的错误(以下错误),我将其修复如下:

  • 如果您的 error_log 说类似:

    client denied by server configuration:
    /Users/myusername/Sites/mySite
    

    那么您的问题不在于您的文件权限,而在于您的 Apache 配置。

    请注意,在您的httpd.conf 文件中,您将看到这样的默认配置(Apache 2.4+):

    <Directory />
        AllowOverride none
        Require all denied
    </Directory>
    

    或像这样(Apache 2.2):

    <Directory />
      Order deny,allow
      Deny from all
    </Directory>
    

    不要改变这个!我们不会在全局范围内覆盖这些权限,而是在您的 httpd-vhosts.conf 文件中覆盖。 但是,首先,请确保 httpd.conf 中的 vhost Include未注释。它应该看起来像这样。 (您的确切路径可能不同。)

    # Virtual hosts
    Include etc/extra/httpd-vhosts.conf
    

    现在,打开您刚刚Included 的httpd-vhosts.conf 文件。如果您还没有,请为您的网页添加一个条目。它应该看起来像这样。 DocumentRootDirectory 路径应该相同,并且应该指向您的 index.htmlindex.php 文件所在的位置。对我来说,它在 public 子目录中。

    对于 Apache 2.2:

    <VirtualHost *:80>
    #     ServerAdmin webmaster@dummy-host2.example.com
        DocumentRoot "/Users/myusername/Sites/mySite/public"
        ServerName mysite
    #     ErrorLog "logs/dummy-host2.example.com-error_log"
    #     CustomLog "logs/dummy-host2.example.com-access_log" common
        <Directory "/Users/myusername/Sites/mySite/public">
            Options Indexes FollowSymLinks Includes ExecCGI
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
        </Directory>
    </VirtualHost>
    

    台词

    AllowOverride All
    Require all granted
    

    对于 Apache 2.4+ 至关重要。如果没有这些,您将不会覆盖httpd.conf 中指定的默认 Apache 设置。请注意,如果您使用的是 Apache 2.2,这些行应该改为

    Order allow,deny
    Allow from all
    

    此更改一直是造成此问题的 google 用户(例如我)困惑的主要原因,因为复制粘贴这些 Apache 2.2 行在 Apache 2.4+ 中不起作用,而且 Apache 2.2 行仍然常见于旧帮助中线程。

    保存更改后,重新启动 Apache。此命令将取决于您的操作系统和安装,因此如果您需要帮助,请单独搜索。

我希望这对其他人有帮助!


PS:如果您在查找这些.conf 文件时遇到问题,请尝试运行find 命令,例如:

$ find / -name httpd.conf

【讨论】:

  • 很好的答案,我有版本之间的冲突(我是 2.4+)导致“客户端被服务器配置拒绝”错误。
  • PHP 缺少 ExecCGI。谢谢指点!
【解决方案3】:

restorecon 命令如下:

restorecon -v -R /var/www/html/

【讨论】:

  • 这是做什么的?
  • apt install policycoreutils 然后man restorecon,恢复文件默认的 SELinux 安全上下文(-v:显示更改,-R 递归)。
  • 这应该被赞成
【解决方案4】:

请注意,可能导致此问题的另一个问题是,父目录的“FollowSymLinks”选项可能已被项目目录的选项错误地覆盖 .对我来说就是这种情况,让我拔头发,直到我找出原因!

以下是此类错误的示例:

<Directory />
        Options FollowSymLinks
        AllowOverride all
        Require all denied
</Directory>

<Directory /var/www/>
        Options Indexes # <--- NOT OK! It's overwriting the above option of the "/" directory.
        AllowOverride all
        Require all granted
</Directory>

所以现在如果你检查 Apache 的日志消息 (tail -n 50 -f /var/www/html/{the_error_log_file_of_your_site}) 你会看到这样的错误:

Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive
is also forbidden due to its similar ability to circumvent directory restrictions

这是因为上述/var/www 目录规则中的Indexes 覆盖了/ 目录的FolowSymLinks。因此,既然您知道了原因,为了解决它,您可以根据需要做很多事情。例如:

<Directory />
        Options FollowSymLinks
        AllowOverride all
        Require all denied
</Directory>

<Directory /var/www/>
        Options FollowSymLinks Indexes # <--- OK.
        AllowOverride all
        Require all granted
</Directory>

甚至这个:

<Directory />
        Options FollowSymLinks
        AllowOverride all
        Require all denied
</Directory>

<Directory /var/www/>
        Options -Indexes # <--- OK as well! It will NOT cause an overwrite.
        AllowOverride all
        Require all granted
</Directory>

上面的例子不会引起覆盖问题,因为在Apache中,如果一个选项是“+”,它只会覆盖“+”,如果是“-”,它会覆盖“ -"s... (不过,不要问我对此的参考,这只是我对 Apache 错误消息的解释(通过 journalctl -xe 检查),它说:Either all Options must start with + or -, or no Option may. 当一个选项有签名,但另一个没有(例如,FollowSymLinks -Indexes)。所以这是我个人的结论-因此应该持保留态度-如果我使用-Indexes作为选项,那将被视为Apache 提供的一组完全不同的选项与“/”中没有任何符号的其他选项,因此最终不会发生烦人的重写,我可以通过上述规则成功确认我自己的项目目录)。

希望这能帮助你少扯头发! :)

【讨论】:

    【解决方案5】:

    然而,它并不能解决问题,因为例如打开 SUSE Tumbleweed,自定义源代码构建在默认网页上触发相同的 401 错误,该网页已相应配置索引和

    Require all granted
    

    【讨论】:

      【解决方案6】:

      服务器可能需要读取您的主目录和其中的 .htaccess 的权限

      【讨论】:

      • 一旦我创建了用户/home/username 的主目录,public_html 文件夹就在其中,可以按组执行,其他人使用:chmod 711 /home/username 我能够摆脱 403 错误。只是认为我需要 public_html 的执行权限,因为它里面的文件夹是 Webroot,因为我理解阅读 petefreitag.com/item/793.cfm 。但我错了。
      【解决方案7】:

      您可以尝试禁用selinux,然后使用以下命令再次尝试

      setenforce 0
      

      【讨论】:

        【解决方案8】:

        在我的情况下,它失败了,因为我的源服务器的 IP 没有在目标服务器中列入白名单。

        例如我试图从源服务器上运行的应用程序访问https://prodcat.ref.test.co.uk。 在源服务器上通过 ifconfig 查找 IP

        此 IP 应在目标服务器的 apache 配置文件中列入白名单。如果不是,则将其列入白名单。

        为白名单添加 IP 的步骤(如果您也控制目标服务器) ssh 到 apache 服务器 须藤苏- cd /usr/local/apache/conf/extra(实际目录可能因您的配置而异)

        找到目标应用程序的配置文件,例如prodcat-443.conf

        RewriteCond %{REMOTE_ADDR} <YOUR Server's IP> 
        for e.g.
        RewriteCond %{REMOTE_ADDR} !^192\.68\.2\.98
        

        希望这对某人有所帮助

        【讨论】:

          猜你喜欢
          • 2011-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-16
          • 1970-01-01
          • 1970-01-01
          • 2021-09-04
          • 2015-08-19
          相关资源
          最近更新 更多