我有以下的apache2 / wsgiconfiguration,这工作正常,除了apache保持logging:
[info] Initial (No.1) HTTPS request received for child 1 (server myserver:443) [error] [client <IP>] client denied by server configuration: /empty/<API_CALL>
每次调用“ https:// myserver / rest / API_CALL ”
<VirtualHost *:443> ServerName myserver:443 DocumentRoot /empty/ <Directory /> Order allow,deny Deny from all </Directory> SSLEngine On SSLCertificateFile /cert.pem SSLCertificateKeyFile /key.pem SSLVerifyClient optional_no_ca SSLOptions +StdEnvVars +ExportCertData WSGIDaemonProcess my.api processes=2 threads=1 display-name=%{GROUP} python-path=/API WSGIProcessGroup my.api WSGIScriptReloading On WSGIScriptAlias /rest /API/server.py <Directory /API/> <Files server.py> Order deny,allow Allow from all SetHandler wsgi-script Options ExecCGI </Files> </Directory> </VirtualHost>
为什么Apache试图访问DocumentRoot中的某些东西? 我怎样才能阻止呢?
编辑与Apache2.4相同的问题:
AH01797: client denied by server configuration: /empty/<API_CALL>
编辑从以下位置更新访问控制语法:
<Directory /> Order allow,deny Deny from all </Directory> <Directory /API/><Files server.py> Order deny,allow Allow from all </Files></Directory>
至:
<Directory /> Require all denied </Directory> <Directory /API/><Files server.py> Require all granted </Files></Directory>
修复了这个问题。 谢谢。
我怎样才能阻止呢?
我从你的问题中拿出了以下部分:
<VirtualHost *:443> ServerName myserver:443 DocumentRoot /empty/ <Directory /> Order allow,deny Deny from all </Directory>
如果/rest/API_CALL是唯一使用的URI, 并且由于WSGIScriptAlias ,我相信我的答案将消除以下错误:
AH01797:客户端被服务器configuration拒绝
DocumentRoot和<Directory> ,Apache的httpd将从主httpd.conf取得默认值(取决于你的发行版和/或打包,位置可以指向不同的地方,例如我将常见的例如/var/www/html ),还有<Directory>默认值,它应该满足httpd将错误写入error_log 。 我build议在应用到现场环境之前,在testing环境中testing这些更改。
而且,在回答这个问题的同时,我自己也学到了一些新的东西)。 我认为这是常犯的错误,所以我想我会和大家分享一下:
应该指定DocumentRoot,而不使用斜线。
也许我得到这个错误(在看了Apache文档后,我现在确定这是正确的) – 但不认为它是从DocumentRoot提供文件? – 这和rest没有任何关系(这是你的代码的URL) – 如果你没有托pipe这个虚拟主机的文件,那么只需要指定与默认的apache文档根目录相同的文件。 您在这里调用文档根htps:// myserver:443,然后代理脚本根/rest。
其http请求> docroot>拒绝> scriptalias> 200
Apache有一个DocumentRoot和WSGIScriptAlias只是一种代理types,保持文档和代码的独立性。
总结 – Apache必须有一个Document根,(即使你禁用了文档根目录,它将默认为PREFIX / htdocs),所以这是一个有效的和预期的错误,脚本别名不会取代文档根目录,而是在URL定义WSGIScriptAlias /rest /API/server.py – > https:// server / rest 。
ServerName myserver:443 DocumentRoot / empty /
命令允许,拒绝所有的拒绝客户端被服务器configuration拒绝:/ empty /
我认为这是正确的:
<VirtualHost *:443> ServerName myserver:443 **DocumentRoot /** <Directory /> Order allow,deny **allow from all** </Directory> SSLEngine On SSLCertificateFile /cert.pem SSLCertificateKeyFile /key.pem SSLVerifyClient optional_no_ca SSLOptions +StdEnvVars +ExportCertData WSGIDaemonProcess my.api processes=2 threads=1 display-name=%{GROUP} python-path=/API WSGIProcessGroup my.api WSGIScriptReloading On **WSGIScriptAlias /** /API/server.py <Directory /API/> <Files server.py> Order deny,allow Allow from all SetHandler wsgi-script Options ExecCGI </Files> </Directory> </VirtualHost>
文档根目录是一个基本而明确的选项,您不能拥有,但可以拒绝访问。