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

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

我有以下 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>httpderror_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>

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

相关内容