我有以下 apache2/wsgi 配置,除了 apache 继续记录之外,它运行良好:
[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://我的服务器/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>
问题已解决。谢谢。
答案1
- 我将尝试回答您问题的第二部分:
我怎样才能阻止这种情况?
我从您的问题中摘取了以下部分:
<VirtualHost *:443>
ServerName myserver:443
DocumentRoot /empty/
<Directory />
Order allow,deny
Deny from all
</Directory>
如果/rest/API_CALL
是唯一使用的 URI和因为WSGIScriptAlias
,我相信我的回答将消除以下错误:
AH01797:服务器配置拒绝客户端
- 通过注释掉
DocumentRoot
和<Directory>
,Apachehttpd
将从主要中获取默认值httpd.conf
(取决于您的发行版和/或包装,位置可能指向不同的地方,作为示例,我将采用常见的例如),也/var/www/html
有默认值,这应该满足将错误写入。<Directory>
httpd
error_log
我建议在应用到实时环境之前先在测试环境中测试这些变化。
另外,在回答这个问题的时候,我自己也学到了一些新东西。我认为这是许多人常犯的错误,所以我想与大家分享一下:
指定的 DocumentRoot 不应带有尾部斜杠。
答案2
也许我弄错了(看了 Apache 文档后,我现在确定这是正确的) - 但 Apache 不认为它正在从 DocumentRoot 提供文件吗? - 这与 /rest 无关(这是你的代码 URL) - 如果你没有从这个虚拟主机托管文件,那么只需指定与默认 apache 文档根目录相同的 documentroot。你在这里调用文档根目录 htps://myserver:443,然后代理到脚本根目录 /rest。
其 http 请求 > docroot > 拒绝 > scriptalias > 200
Apache 有一个 DocumentRoot,而 WSGIScriptAlias 只是一种代理类型,它将你的文档和代码分开。
总结 - Apache 必须有一个文档根目录,(即使你禁用文档根目录,它也会默认为 PREFIX/htdocs)所以这是一个有效且预期的错误,脚本别名不会替换文档根目录,而是在定义的 URL 处关闭代理WSGIScriptAlias /rest /API/server.py
-->https://服务器/rest。
ServerName myserver:443 DocumentRoot /empty/
命令允许、拒绝 全部拒绝客户端被服务器配置拒绝:/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>
文档根目录是一个基本且明确的选项,您不能没有它,但可以拒绝访问。