Apache给出了403个禁止的错误

时间:2013-08-26 15:16:58

标签: html apache vhosts

好的,所以我以前设置了两个虚拟主机,他们工作很酷。它们都包含简单的Web项目,并且在浏览器中与http://project1http://project2一起正常工作。

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

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

访问http://project3

时,我收到403禁止拒绝权限的消息

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

提前致谢。

8 个答案:

答案 0 :(得分:20)

检查:

  • 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。弄清楚。

答案 1 :(得分:6)

restorecon命令的工作原理如下:

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

答案 2 :(得分:6)

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

首先,检查您的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文件中覆盖。 但是,首先,请确保您的Include中的虚拟主机httpd.conf未注释。它应该看起来像这样。 (您的确切路径可能有所不同。)

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

    现在,打开刚刚httpd-vhosts.conf d的Include文件。如果您还没有网页条目,请为其添加一个条目。它看起来应该像这样。 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员工困惑的主要根源,例如I,因为复制粘贴这些Apache 2.2行在Apache 2.4+中不起作用,并且Apache 2.2行仍旧存在于较早的帮助中线程。

    保存更改后,重新启动Apache 。用于此操作的命令将取决于您的操作系统和安装,因此如果需要帮助,请分别在Google上进行搜索。

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


PS:如果找不到这些.conf文件,请尝试运行find命令,例如:

$ find / -name httpd.conf

答案 3 :(得分:1)

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

答案 4 :(得分:1)

但是,它不能解决问题,因为例如打开SUSE Tumbleweed,自定义源代码构建会在默认网页上触发相同的401错误,并相应地使用索引和

进行了配置
Require all granted

答案 5 :(得分:0)

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

setenforce 0

答案 6 :(得分:0)

在我的情况下,由于源服务器的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

希望这对某人有帮助

答案 7 :(得分:0)

请注意,可能导致 的另一个问题是,上级目录的“ 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

这是因为上述Indexes目录规则中的/var/www会覆盖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视为与“ /”中其他选项完全不同的选项集,该选项上没有任何符号,因此最后不会发生烦人的重写,我可以成功确认根据上述规则在我自己的项目目录中。

希望这将帮助您少拉头发! :)