尝试通过浏览器访问localhost时出现此错误。
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>
如果您使用的是Apache 2.4
您必须检查允许和拒绝规则
看看http://httpd.apache.org/docs/2.4/upgrading.html#access
在2.2中,使用指令Order,Allow,Deny和Satisfy完成了基于客户端主机名,IP地址和客户端请求的其他特征的访问控制。
在2.4中,使用新模块mod_authz_host以与其他授权检查相同的方式完成此类访问控制。
新指令是Require:
2.2配置:
Order allow,deny
Allow from all
2.4配置:
Require all granted
另外不要忘记在这些更改后重启apache服务器(# service httpd restart
)
就我而言,
我正在使用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>
所有你要做的就是用你的确切的ProjectFolderName替换MainProjectFolderName。
这让我发疯了。最后弄清楚问题是什么:我使用错误日志的直接路径,他们错了。
为什么Apache会给出一个模糊(错误)的错误消息?而是使用正确且有用的错误消息,例如:ErrorLog指令的路径“/wrong/path/and/filename.log”无效。
无论如何,要修复以确保您的错误日志指令看起来像这样:
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
如果您在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服务,然后重试。
如果您有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
对于Wamp 3(Apache 2.4),除了按照其他答案中的说明将服务器置于联机状态之外,还可以在虚拟主机文件中使用conf/extra/httpd-vhosts.conf
你可能需要更换
Require local
同
Require all granted
如果你在httpd.conf
,这是适用的
Include conf/extra/httpd-vhosts.conf
如果这个页面上没有其他答案供您工作,这就是我经过几个小时的挣扎后遇到的问题。
我使用了特定于用户的配置,在Sites
中将UserDir
指定为我的/private/etc/apache2/extra/httpd-userdir.conf
。但是,我被禁止访问端点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
除了缺少其他答案中提到的Order
和Allow
指令之外,请注意DirectoryMatch
指令的不匹配正则表达式也可能导致此错误。
如果请求的路径是/home/user-foo1bar/www/myproject/
,则以下匹配将不匹配
<DirectoryMatch "/home/user-[a-z]+/www/myproject/">
...
</DirectoryMatch>
因此,即使有效的访问配置也可能导致此错误。
一个不起眼的(刚刚处理它),但可能的原因是一个内部mod_rewrite规则,在主配置文件(不是.htaccess)中写入存在于服务器文件系统根目录的路径。假设您的站点中有/media
目录,并且您重写了以下内容:
RewriteRule /some_image.png /media/some_other_location.png
如果在服务器的根目录下有/media
目录,则会尝试重写(导致访问被拒绝错误)而不是站点目录中的那个,因为首先由mod_rewrite检查文件系统根目录,在您的站点目录之前存在路径中的第一个目录。
问题可能是该指令不在<Directory>下
https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html#requiredirectives
该指令可以在<Directory>,<Files>或<Location>部分中引用,也可以在.htaccess文件中引用,以控制对服务器特定部分的访问。可以根据客户端主机名或IP地址控制访问。
我得到了另一个可能对某人有用的人。从PHP 5.6 => 7.0升级后收到相同的错误消息。我们更改了PHP上传设置,忘记了一旦复制就更改了。即使我当时没有上传图片,Silverstripe(我们的CMS)拒绝保存并抛出该错误。增加了图像上传大小,它可以直接使用。
对于所有目录,请写Require all granted
而不是Allow from all
更新
如果以上不起作用,那么也删除以下提到的行:
订单允许,拒绝
使用Ubuntu时,请检查CGI模块是否已启用。如果不:
sudo a2enmod cgi
对于那些像我一样坚持这个错误但从上面没有任何帮助的人:检查你的服务器上是否存在error.log中的问题文件夹。我是由Django在错误的地方自动生成的(被静态根,然后manage.py collectstatic
搞砸)。不知道为什么不能正确命名错误。
如果这有助于任何人像我一样谷歌搜索,我有这个错误消息试图访问我的服务器上的SVG文件,例如https://example.com/images/file.svg。其他文件类型似乎很好,只是SVG失败了。
我在/etc/httpd
conf文件周围寻找并检查了每个require all denied
类型的配置,并且无法找到具有此效果的配置。
我将LogLevel转换为VirtualHost配置中的调试,并且可以看到mod_authz_core日志记录指定有一个'Require all denied'生效:
[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
通过盲测我将文件移动到web根的根目录,然后发现我可以在https://example.com/file.svg访问它..所以它只能在'images'文件夹中失败。这导致我在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文件,导致您访问时遇到问题的文件,以防有这样的tom foolery正在进行。
仔细检查DocumentRoot路径是否正确。这可能会导致此错误。
我做了一些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>
这让我绝对坚持了一天半,但如果所有其他解决方案都尝试失败,我找到了解决办法。
这适用于macOS。
那时我立刻停止了403错误,一切都按预期开始工作。奇怪的是我甚至没有重启apache它只是工作,我想当我去我的本地主机时它重新启动,老实说我不知道但我想问题是Apache在使用apachectl restart时实际上没有重启,或者停止或开始。希望这有助于某人。
如果您拖尾错误日志并重新加载页面,您应该会看到有关确切问题的更多信息。
抓住环境变量,以便$ {APACHE_LOG_DIR}实际工作......
source /etc/apache2/envvars
然后尾巴观看......
tail -f ${APACHE_LOG_DIR}/error.log
花了几个小时后,我解决了自己的问题。
我在vagrant vm中通过coookbook安装了Apache / 2.4.7(Ubuntu)。
/etc/apache2/apache2.conf文件默认没有<VirtualHost *:80>
元素。
为了完成它,我做了两处修改
<VirtualHost *:80>
然后我终于启动了vm ..
有没有人想过wamp服务器默认不包括httpd-vhosts.conf
文件。我的方法是删除下面的注释
conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
在httpd.conf
文件中。就这些。