45

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

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

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

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

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

4

8 回答 8

42

检查:

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

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

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

于 2013-08-26T15:19:57.753 回答
23

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

首先,检查您的 Apacheerror_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 错误,并且您的 Apacheerror_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文件中覆盖。但是,首先,请确保您的 vhostIncludehttpd.confuncommented。它应该看起来像这样。(您的确切路径可能不同。)

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

    现在,打开httpd-vhosts.conf您刚刚Included 的文件。如果您还没有,请为您的网页添加一个条目。它应该看起来像这样。DocumentRootandDirectory路径应该相同,并且应该指向您的orindex.html文件index.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 2.2,这些行应该改为

    Order allow,deny
    Allow from all
    

    这种变化一直是这个问题的 googlers 混淆的主要来源,比如我,因为复制粘贴这些 Apache 2.2 行在 Apache 2.4+ 中不起作用,而且 Apache 2.2 行仍然常见于旧的帮助线程上。

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

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


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

$ find / -name httpd.conf
于 2018-07-07T18:50:02.940 回答
9

restorecon命令的工作方式如下:

restorecon -v -R /var/www/html/
于 2015-03-23T10:33:22.263 回答
2

请注意,可能导致此问题的另一个问题是,父目录的“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 中,如果选项是“+”,它将只覆盖“+”,如果是“-”,它将覆盖“-”...(尽管不要问我对此的参考,这只是我对 Apache 错误消息的解释(通过检查journalctl -xe)说:Either all Options must start with + or -, or no Option may.当一个选项有符号,但另一个没有(例如,FollowSymLinks -Indexes)。所以这是我个人的结论——因此应该持保留态度——如果我-Indexes将其用作选项,Apache 将把它视为与“/”中的另一个选项完全不同的一组选项,其中上面没有任何标志,因此最终不会发生烦人的重写,我可以在我自己的项目目录中通过上述规则成功确认)。

希望这会帮助你减少你的头发!:)

于 2020-10-21T22:13:35.683 回答
2

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

Require all granted
于 2020-11-02T23:14:43.147 回答
1

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

于 2013-12-15T08:07:04.717 回答
0

您可以尝试禁用 selinux 并使用以下命令再次尝试

setenforce 0
于 2018-06-25T06:45:41.703 回答
0

就我而言,它失败了,因为我的源服务器的 IP 未在目标服务器中列入白名单。

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

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

为白名单添加 IP 的步骤(如果您还控制目标服务器) ssh 到 apache 服务器 sudo su - 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

希望这可以帮助某人

于 2019-09-11T13:12:56.997 回答