【问题标题】:Apache2: 'AH01630: client denied by server configuration'Apache2:'AH01630:客户端被服务器配置拒绝'
【发布时间】:2013-08-25 21:49:47
【问题描述】:

我在尝试通过浏览器访问本地主机时收到此错误。

AH01630: client denied by server configuration

我使用以下方法检查了我的站点文件夹权限:

sudo chmod 777 -R *

这是我的配置文件:

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /home/user-name/www/myproject
<Directory />
    Options FollowSymLinks
    AllowOverride all
    Allow from all
</Directory>

<Location />
  Allow from all
  Order Deny,Allow
</Location>

<Directory  /home/user-name/www/myproject/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride all
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride all
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

【问题讨论】:

标签: server apache2 apache2.4


【解决方案1】:
...
<IfVersion < 2.4>
   Order allow,deny
   Allow from all
</IfVersion>
<IfVersion >= 2.4>
   Require all granted
</IfVersion>
...

【讨论】:

    【解决方案2】:

    我花了一些时间才让它在我自己的 FreeBSD 服务器上运行..

    • FreeBSD 13
    • Apache 2.4
    • Python 3.8
    • 让我们加密

    .. 但最终我想出了一个可以工作的虚拟主机:

    <VirtualHost *:443>
    
        ServerName mysite.mydomain.com
        DocumentRoot "/usr/local/www/apache24/data/mysite
    
        WSGIDaemonProcess mysite python-path=/usr/local/www/apache24/data/mysite/venv/lib/python3.8/site-packages/
        WSGIProcessGroup mysite
        WSGIScriptAlias / /usr/local/www/apache24/data/mysite/core/wsgi.py
    
        SSLEngine on
        SSLCertificateFile "/usr/local/etc/letsencrypt/live/mysite.mydomain.com/cert.pem"
        SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/mysite.mydomain.com/privkey.pem"
        SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem"
    
        <FilesMatch "\.(cgi|shtml|phtml|php|py)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
    
        BrowserMatch "MSIE [2-5]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    
        CustomLog "/usr/local/www/apache24/data/mysite/log/py-ssl.log" \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
        CustomLog "/usr/local/www/apache24/data/mysite/log/py-access.log" combined
        ErrorLog "/usr/local/www/apache24/data/mysite/log/py-error.log"
    
        <Directory "/usr/local/www/apache24/data/mysite">
            AllowOverride All
            Options +ExecCGI
            Require all granted
            Allow from all
        </Directory
    
    </VirtualHost>
    

    【讨论】:

      【解决方案3】:

      获取问题的解决方案,需要在 apache2.conf 文件中进行更改,然后才能正常工作, /etc/apache2/apache2.conf 中的旧代码

      <Directory /var/www/>
              Options Indexes FollowSymLinks
              AllowOverride None
              Require all granted
      </Directory>
      
      

      改成

       <Directory /var/www/>
                  Options Indexes FollowSymLinks
                  AllowOverride All
                  Require all granted
          </Directory>
      
      

      之后,为了让 Apache 理解重写规则,我们首先需要激活 mod_rewrite。它已经安装,但在默认的 Apache 安装中被禁用。使用 a2enmod 命令启用模块:

      $ sudo a2enmod rewrite
      
      

      这将激活模块或提醒您该模块已启用。要使这些更改生效,请重新启动 Apache。

      $ sudo systemctl restart apache2
      
      

      它终于对我有用了。

      【讨论】:

        【解决方案4】:

        对我来说,所有提议的解决方案都行不通。这会有所帮助,如果您使用 cgi、fastcig 或 fpm 作为代理,您必须在 vhost 中添加一个位置以避免此问题。这允许 404 成为直通代理。

        <Location />
        require all granted
        </Location>
        

        【讨论】:

          【解决方案5】:

          因为这个线程是搜索提到的错误时弹出的第一件事,所以我想添加另一个可能导致此错误的原因:您可能有mod_evasive 处于活动状态,而看到此错误的客户端只是越过了配置的限制在你的mod_evasive.conf

          如果您突然收到以前没有问题且其他没有任何变化的客户的此错误,则这尤其值得调查。

          (如果mod_evasive 是原因,那么如果客户端只是暂时停止尝试访问该站点,错误将自行消失;但这可能表明您配置的限制过于严格)

          【讨论】:

            【解决方案6】:

            这个“bug”实际上是 Apache 2.4 的新常态。就我而言,我有一个非常具体的规则来拒绝访问名称以“。”开头的任何文件夹或文件,因此我必须为需要这种奇怪名称的特定公用文件夹设置例外。

            为了记录,我的特定重写规则是:

            RewriteRule "(?!\.trusted)(^|/)\." - [F]

            这条规则 [F] 包含以“.”开头的所有内容。但是.trusted,感谢正则表达式的魔力“?!”否定。

            【讨论】:

              【解决方案7】:

              对我来说,我实际上已经根据 2.4 标准更新了 Allow 和 Deny 规则。

              Require all granted
              

              但是,这仍然导致我收到相同的 AH01630 错误。我找到了另一个线程,它建议重新安装 apache2。不知何故,这奏效了!如果有人愿意解释原因,那将很有帮助。

              归功于:AH01630: client denied by server configuration but require all granted is set (Apache 2.4, CentOs)

              【讨论】:

                【解决方案8】:

                我实际上通过将目录访问添加到 :80 条目来解决这个问题。

                 <Directory "c:/whatever-directory-you-use/">
                    AllowOverride All
                    Require all granted
                </Directory>
                

                在所有人都对我“安全”之前,根据我的具体情况,这不是安全问题。

                如果您使用的是远程资源,我建议您确保您的 CURL 请求通过 HTTPS/TLS 进行,然后此目录条目通过 443 端口进行。

                【讨论】:

                  【解决方案9】:

                  如果这有助于像我一样在谷歌上搜索的任何人,我在尝试访问服务器上的 SVG 文件时收到此错误消息,例如https://example.com/images/file.svg。其他文件类型似乎很好,只是 SVG 失败了。

                  我在/etc/httpd conf 文件中搜寻并检查了每个require all denied 类型的配置,但找不到具有这种效果的配置。

                  我将 LogLevel 转为在 VirtualHost 配置中进行调试,并且可以看到 mod_authz_core 日志记录指定了“要求全部被拒绝”:

                  [Mon Jun 10 13:09:54.321022 2019] [authz_core:debug] [pid 23459:tid 140576341206784] mod_authz_core.c(817): [client 127.0.0.1:54626] AH01626: authorization result of Require all denied: denied
                  [Mon Jun 10 13:09:54.321038 2019] [authz_core:debug] [pid 23459:tid 140576341206784] mod_authz_core.c(817): [client 127.0.0.1:54626] AH01626: authorization result of <RequireAny>: denied
                  [Mon Jun 10 13:09:54.321082 2019] [authz_core:error] [pid 23459:tid 140576341206784] [client 127.0.0.1:54626] AH01630: client denied by server configuration: /home/blah/htdocs/images/file.svg
                  

                  通过盲测,我将文件移动到网络根目录的根目录下,然后发现我可以在https://example.com/file.svg 访问它。所以它只在“图像”文件夹中失败。这导致我在 images 文件夹中找到了一个我不知道的 .htaccess 文件。

                  原来 Zen Cart 1.5 带有一个 images/.htaccess 文件,其中包含:

                  # deny *everything*
                   <FilesMatch ".*">
                     <IfModule mod_authz_core.c>
                       Require all denied
                     </IfModule>
                     <IfModule !mod_authz_core.c>
                       Order Allow,Deny
                       Deny from all
                     </IfModule>
                   </FilesMatch>
                  
                   # but now allow just *certain* necessary files:
                   <FilesMatch "(?i).*\.(jpe?g|gif|webp|png|swf)$" >
                     <IfModule mod_authz_core.c>
                       Require all granted
                     </IfModule>
                     <IfModule !mod_authz_core.c>
                       Order Allow,Deny
                       Allow from all
                     </IfModule>
                   </FilesMatch>
                  

                  非常烦人,我希望这可以提醒其他人检查文件系统各个级别的 .htaccess 文件,以防万一出现这种情况时您无法访问该文件汤姆傻瓜正在发生。

                  【讨论】:

                    【解决方案10】:

                    如果您在 Windows 操作系统上的 WampServer 中使用 Apache 2.4。

                    您需要在记事本中打开 https-vhosts.conf 文件。

                    C:\wamp64\bin\apache\apache2.4.37\conf\extra\https-vhosts.conf 
                    

                    如果您无法找到上述文件。检查下面的屏幕截图

                     <VirtualHost *:80>
                         ServerName localhost
                         DocumentRoot c:/wamp64/www
                         <Directory  "c:/wamp64/www/">
                            Options Indexes FollowSymLinks MultiViews
                            AllowOverride All
                            Require local
                        </Directory>
                    </VirtualHost>
                    

                    在上面的代码中替换

                    Require local
                    

                    Require all granted
                    

                    并保存它。重新启动 Apache 服务,然后重试。

                    【讨论】:

                      【解决方案11】:

                      对于那些像我一样遇到此错误并且上面没有任何帮助的人:检查 error.log 中的问题文件夹是否确实存在于您的服务器上。我的是 Django 在错误的地方自动生成的(被静态根目录弄乱了,然后是manage.py collectstatic)。不知道为什么不能正确命名错误。

                      【讨论】:

                      • 谢谢你提醒我动动脑筋,解决了我的问题。 +1 哈哈
                      【解决方案12】:

                      确保包含任何用户特定的配置!

                      如果此页面上的其他答案都没有为您工作,这就是我在挣扎了几个小时后遇到的问题。

                      我使用了用户特定的配置,在/private/etc/apache2/extra/httpd-userdir.conf 中将Sites 指定为我的UserDir。但是,我被禁止访问端点http://localhost/~jwork/

                      我可以在/var/log/apache2/error_log 中看到对/Users/jwork/Sites/ 的访问被阻止。但是,我被允许通过http://localhost/ 访问 DocumentRoot。这表明我无权查看~jwork 用户。但据ps aux | egrep '(apache|httpd)'lsof -i :80 所知,Apache 是为jwork 用户运行的,所以我的用户配置显然没有写一些东西。

                      给定一个名为 jwork 的用户,这是我的配置文件:

                      /private/etc/apache2/users/jwork.conf

                      <Directory "/Users/jwork/Sites/">
                          Require all granted
                      </Directory>
                      

                      这个配置是完全有效的。但是,我发现我的用户配置没有被包括在内:

                      /private/etc/apache2/extra/httpd-userdir.conf

                      ## Note how it's commented out by default.
                      ## Just remove the comment to enable your user conf.
                      #Include /private/etc/apache2/users/*.conf
                      

                      请注意,这是 userdir conf 文件的默认路径,但正如您将在下面看到的,它可以在 httpd.conf 中配置。确保启用以下行:

                      /private/etc/apache2/httpd.conf

                      Include /private/etc/apache2/extra/httpd-userdir.conf
                      
                      # ...
                      
                      LoadModule userdir_module libexec/apache2/mod_userdir.so
                      

                      【讨论】:

                        【解决方案13】:

                        就我而言,

                        我正在使用 macOS Mojave (Apache/2.4.34)。 /etc/apache2/extra/httpd-vhosts.conf 文件中的虚拟主机设置存在问题。添加所需的目录标签后,我的问题就消失了。

                        要求全部授予

                        希望完整的虚拟主机设置结构可以帮助您。

                        <VirtualHost *:80>
                            DocumentRoot "/Users/vagabond/Sites/MainProjectFolderName/public/"
                            ServerName project.loc
                        
                            <Directory /Users/vagabond/Sites/MainProjectFolderName/public/>
                                Require all granted
                            </Directory>
                        
                            ErrorLog "/Users/vagabond/Sites/logs/MainProjectFolderName.loc-error_log"
                            CustomLog "/Users/vagabond/Sites/logs/MainProjectFolderName.loc-access_log" common
                        </VirtualHost>
                        

                        您只需将 MainProjectFolderName 替换为您的确切 ProjectFolderName。

                        【讨论】:

                          【解决方案14】:

                          使用 Ubuntu 时检查 CGI 模块是否启用。如果没有:

                          sudo a2enmod cgi
                          

                          【讨论】:

                          • 需要启用 CGI 模块。程序终于成功了。
                          【解决方案15】:

                          我得到了另一个可能对某人有用的东西。 从 PHP 5.6 => 7.0 升级后收到相同的错误消息。我们更改了 PHP 上传设置,但复制后忘记更改。 尽管我当时没有上传图片,但 Silverstripe(我们的 CMS)拒绝保存并抛出该错误。增加了图片上传大小,它立即生效。

                          【讨论】:

                            【解决方案16】:

                            问题可能是指令不在

                            https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html#requiredirectives

                            该指令可以在 部分以及 .htaccess 文件中引用,以控制对服务器特定部分的访问。可以根据客户端主机名或 IP 地址控制访问。

                            【讨论】:

                              【解决方案17】:

                              这让我疯狂了一天半,但如果所有其他解决方案都尝试不成功,我找到了解决方案。

                              这是针对 macOS 的。

                              • 转到活动监视器(聚焦搜索:活动)
                              • 在活动监视器中搜索作为 Apache 服务的 httpd
                              • 选择属于root的那个,点击左上角的X关闭。

                              那时我立即停止收到 403 错误,一切都开始按预期工作。奇怪的是我什至不必重新启动 apache 它就可以工作,我想当我去我的本地主机时它会自行重新启动,老实说我不知道​​,但我想问题是使用 apachectl restart 时 Apache 实际上没有重新启动,或者停止或开始。希望这可以帮助某人。

                              【讨论】:

                              • 经过数小时的浪费时间,这也解决了我的问题。
                              【解决方案18】:

                              一个晦涩的(刚刚处理过)但可能的原因是内部 mod_rewrite 规则,在主配置文件(不是 .htaccess)中写入存在于服务器文件系统根目录中的路径.假设您的站点中有一个/media 目录,然后您重写如下内容:

                              RewriteRule /some_image.png /media/some_other_location.png
                              

                              如果您的服务器根目录中有/media 目录,则将尝试重写该目录(导致访问被拒绝错误)而不是您站点目录中的目录,因为首先检查文件系统根目录通过 mod_rewrite,为路径中第一个目录的存在,在您的站点目录之前。

                              【讨论】:

                                【解决方案19】:

                                除了缺少其他答案中提到的OrderAllow 指令外,请注意DirectoryMatch 指令的不匹配正则表达式也可能导致此错误。

                                如果请求的路径是/home/user-foo1bar/www/myproject/,则后面的匹配器将不匹配

                                <DirectoryMatch "/home/user-[a-z]+/www/myproject/">
                                ...
                                </DirectoryMatch>
                                

                                因此,即使是有效的访问配置也可能导致此错误。

                                【讨论】:

                                  【解决方案20】:

                                  问题出在 VirtualHost 但可能不是

                                  要求全部授予

                                  确认您的配置是正确的,这里是正确的示例

                                  【讨论】:

                                  • 包含 &lt;Directory ...&gt; ... &lt;/Directory&gt; 行对我有用,因为我使用的目录路径以前未在 Apache 配置中定义。
                                  【解决方案21】:

                                  对于 Wamp 3 (Apache 2.4),除了按照其他答案中所述将服务器联机之外,在虚拟主机文件 conf/extra/httpd-vhosts.conf
                                  你可能需要更换

                                  Require local
                                  

                                  Require all granted
                                  



                                  这适用于httpd.conf 您有

                                  Include conf/extra/httpd-vhosts.conf
                                  

                                  【讨论】:

                                    【解决方案22】:

                                    如果您有 https 主机,请不要忘记对 ssl 配置进行 Require all granted 更改。

                                    此外,有时以 apache 用户身份检查权限很有用:

                                    # ps -eFH | grep http # get the username used by httpd
                                    ...
                                    apache   18837  2692  0 119996 9328   9 10:33 ?        00:00:00     /usr/sbin/httpd -DFOREGROUND
                                    # su -s/bin/bash apache # switch to that user
                                    bash-4.2$ whoami
                                    apache
                                    bash-4.2$ cd /home
                                    bash-4.2$ ls
                                    bash-4.2$ cd mysite.com
                                    bash-4.2$ ls
                                    bash-4.2$ cat file-which-does-not-work.txt
                                    

                                    【讨论】:

                                      【解决方案23】:

                                      如果您使用的是 Apache 2.4

                                      您必须检查允许和拒绝规则

                                      查看http://httpd.apache.org/docs/2.4/upgrading.html#access

                                      在2.2中,基于客户端主机名、IP地址等的访问控制 客户请求的特征是使用指令完成的 订购、允许、拒绝和满足。

                                      在 2.4 中,此类访问控制的完成方式与其他 授权检查,使用新模块 mod_authz_host。

                                      新指令是Require:

                                      2.2配置:

                                      Order allow,deny
                                      Allow from all
                                      

                                      2.4配置:

                                      Require all granted
                                      

                                      也不要忘记在这些更改之后重新启动 apache 服务器 (# service httpd restart)

                                      【讨论】:

                                      • 使用 Apache 2.4 的 OSX 10.10 Yosemite 作品
                                      • what 的配置(即“要求所有授权”去哪里?在某些 .conf 文件中?)
                                      • @Alexis 目录(或位置)。请参阅下一个答案中的屏幕截图。
                                      • 就我而言,DocumentRoot&lt;Directory&gt; 路径有错误。
                                      • 需要注意的一点:如果您在网上引用配置,他们很可能同时使用了Order allow,deny ...Require all granted。它不会起作用的。根据您的版本,它只需要是其中之一。这就是最初阻止我解决问题的原因。
                                      【解决方案24】:

                                      这让我发疯了。终于知道问题出在哪里了: 我对错误日志使用直接路径,但它们是错误的。

                                      为什么 Apache 给出一个模糊(和错误)的错误信息?而是使用正确且有用的错误消息,例如:ErrorLog 指令“/wrong/path/and/filename.log”的路径无效。

                                      无论如何,要修复,请确保您的错误日志指令看起来像这样:

                                      ErrorLog ${APACHE_LOG_DIR}/error.log
                                      CustomLog ${APACHE_LOG_DIR}/access.log combined
                                      

                                      【讨论】:

                                        【解决方案25】:

                                        有没有人想过 wamp 服务器默认不包含 httpd-vhosts.conf 文件。 我的方法是删除下面的注释

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

                                        httpd.conf 文件中。 仅此而已。

                                        【讨论】:

                                        • +1 这对我也有效,但也许更好的解决方案是保留 conf/extra/httpd-vhosts.conf 文件并将其中的 Require local 替换为 Require all granted
                                        【解决方案26】:

                                        我花了几个小时解决了自己的问题。

                                        我通过 coookbook 在 vagrant vm 中安装了 Apache/2.4.7 (Ubuntu)。

                                        /etc/apache2/apache2.conf 文件默认没有&lt;VirtualHost *:80&gt; 元素。

                                        我做了两个改变来完成它

                                        1. 已添加&lt;VirtualHost *:80&gt;
                                        2. 已添加
                                          选项索引 FollowSymLinks
                                          允许覆盖所有
                                          全部允许

                                        最后我刚刚启动了 vm..

                                        【讨论】:

                                          【解决方案27】:

                                          对于所有目录写Require all granted而不是Allow from all

                                          更新

                                          如果上述方法不起作用,那么还要删除下面提到的这一行:

                                          命令允许,拒绝

                                          【讨论】:

                                          • 在我删除了 Order allow,deny 行之后为我工作。
                                          • 注意:在使用 HTTPS 时,为端口 443 配置 VirtualHost,我必须复制相同的配置 @ default-ssl.conf 上的 987654325@ 用于加载我的 CSS。 (我的问题是登录页面可以访问,但没有加载 CSS 或其他媒体文件......)
                                          • 使用 Apache 2.4 的 OSX 10.10 Yosemite 作品
                                          • 当有人在日志中没有任何输出的情况下破坏 Apache 配置时,我是唯一一个讨厌它的人吗? (嘿男孩们,Allow from All 已退休,因为......原因......)
                                          • 谢谢 - 删除“订单允许,拒绝”有帮助
                                          【解决方案28】:

                                          我做了 ravisorg 对 OSX 10.10 Yosemite 建议的相同更改,将 Apache 升级到 2.4 版。以下是添加到 http.conf 的更改。

                                          <Directory />
                                              AllowOverride none
                                              Require all denied
                                          </Directory>
                                          
                                          <Directory /Volumes/Data/Data/USER/Sites/>
                                              AllowOverride none
                                              Require all granted
                                          </Directory>
                                          

                                          【讨论】:

                                            【解决方案29】:

                                            仔细检查 DocumentRoot 路径是否正确。这可能会导致此错误。

                                            【讨论】:

                                            • 更具体地说,我发现这是我的问题,因为我的 DocumentRoot 声明中没有斜杠,但在 &lt;Directory&gt; 块中使用了斜杠。我也有一些案例差异。一旦我将这两个值相互复制(没有尾部斜杠),它就完美地工作了。
                                            • 如果是这种情况(是的,这里也发生过......)你可以在apache/logs/error.logAH00112: Warning: DocumentRoot [E:/xampp/htdocs/website/frontend/web] does not exist中找到以下行
                                            • 不敢相信我也可以为我的拼写错误找到答案 :-) 感谢您提出这个问题,我的问题是我的 conf 文件中的路径无效。
                                            【解决方案30】:

                                            如果您跟踪错误日志并重新加载页面,您应该会看到有关确切问题的更多信息。

                                            获取环境变量,以便 ${APACHE_LOG_DIR} 真正起作用...

                                            source /etc/apache2/envvars
                                            

                                            那就跟着看吧……

                                            tail -f ${APACHE_LOG_DIR}/error.log
                                            

                                            【讨论】:

                                            • 这是来自日志的错误:'AH01630: client denied by server configuration'
                                            • 如果您将LogLevel debug 添加到 VirtualHost,这是一个很好的建议,因为您会看到诸如“要求所有被拒绝:拒绝”和“:拒绝”之类的行(即更多不仅仅是“客户端被服务器配置拒绝”,因为它实际上告诉你哪个配置!)