Apache提供403禁止错误

dffbzjpn  于 2022-11-16  发布在  Apache
关注(0)|答案(9)|浏览(198)

好的,我之前已经设置了两个虚拟主机,它们都很酷。它们都包含简单的web项目,在浏览器中可以很好地使用http://project1http://project2
我用www.example.com project 3编辑了/etc/hosts文件127.0.0.1,还通过复制和粘贴project 2的先前条目并编辑文件路径更新了httpd-vhosts.conf文件。
我已经检查了所有的文件和文件夹权限(事实上我是从project 2复制并粘贴的),并简单地在index.php文件中放置了一条“hello world”消息。
访问http://project3时收到403禁止权限拒绝消息
为什么会这样,我只是想知道我错过了什么步骤,因为一切似乎都设置正确。

koaltpgm

koaltpgm1#

检查:

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

此外,您可以查看error.log文件(通常位于/var/log/apache2/error.log),该文件将准确描述为什么会出现403错误。
最后,你可能需要重启apache,只是为了确保所有的配置都被应用了。这通常可以用/etc/init.d/apache2 restart来完成。在一些系统上,脚本将被称为httpd。只是弄清楚。

daolsyd0

daolsyd02#

经过几天的努力,我才解决了这个问题。以下是对我有效的方法:
首先,检查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文件中覆盖。但是,首先请确保您的vhost Include行在httpd.conf中为uncommented。它应该如下所示。(您的确切路径可能不同。)

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

现在,打开您刚刚创建的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

这一变化一直是这个问题的谷歌人困惑的主要来源,如我,因为复制粘贴这些Apache 2.2行将不会在Apache 2.4+中工作,而且Apache 2.2行仍然经常在旧的帮助线程中找到。
保存更改后,重新启动Apache。此命令取决于您的操作系统和安装,因此如果需要帮助,请单独搜索。
希望这对其他人有帮助!
PS:如果您在查找这些.conf文件时遇到问题,请尝试运行find命令,例如:

$ find / -name httpd.conf
hmmo2u0o

hmmo2u0o3#

restorecon命令的工作原理如下:

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

fxnxkyjh4#

请注意,另一个 * 可能 * 导致这一点的问题是,父目录的“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中,如果选项是“+”,它将只覆盖“+“,如果是“-",它将覆盖“-“...(不要问我关于这方面的参考,这只是我对Apache错误消息的解释(通过journalctl -xe检查),该消息说:Either all Options must start with + or -, or no Option may.当一个选项有符号,而另一个没有符号时(例如,FollowSymLinks -Indexes)。因此,这是我个人的结论--因此应该有所保留--如果我使用-Indexes作为选项,Apache会将其视为与“/”中没有任何符号的另一个选项完全不同的一组选项,因此最后不会发生令人讨厌的重写,我可以在自己的项目目录中通过上述规则成功地确认这一点)。
希望这能帮助你少拉头发!:)

kokeuurv

kokeuurv5#

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

Require all granted
mf98qq94

mf98qq946#

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

lsmepo6l

lsmepo6l7#

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

setenforce 0
4c8rllxm

4c8rllxm8#

在我的情况下,它是失败的,因为我的源服务器的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

希望这对某人有帮助

2sbarzqh

2sbarzqh9#

新增

<Directory "/path/to/webroot">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow, deny
        Allow from all
        Require all granted
</Directory>

它的作用是告诉Apache 2覆盖之前的所有配置,并在拒绝之前允许所有请求(200)。(403)它还要求所有请求都被授权。这段代码必须放在每个vhost文件中,但它确实有效。我已经用了一年多了。
到您的配置文件(例如/etc/apache 2/sites-enabled/000-default.conf)已测试的LAMP堆栈Debian 11

相关问题