Apache尝试访问DocumentRoot(AH01797)中的wsgi-rest参数

我有以下的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这些更改。


而且,在回答这个问题的同时,我自己也学到了一些新的东西)。 我认为这是常犯的错误,所以我想我会和大家分享一下:

  • 每核心 – Apache HTTP Server版本2.4

应该指定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> 

文档根目录是一个基本而明确的选项,您不能拥有,但可以拒绝访问。