在 Apache HTTP 服务器 2.2 上,ErrorDocument 在我的配置中有一个 PHP CGI 脚本,它显示一条不错的消息并对多个错误代码做出反应,并显示每个错误代码的附加信息。这很好用。
但升级到2.4版本后,就不再执行了。相反,会显示该文件的完整源代码,包括第一行,请参见下文。这是怎么回事?
配置非常简单:
ErrorDocument 401 /cgi-bin/error.cgi
ErrorDocument 403 /cgi-bin/error.cgi
ErrorDocument 404 /cgi-bin/error.cgi
ErrorDocument 500 /cgi-bin/error.cgi
该文件由正确的用户和组拥有并且可执行。它看起来像这样:
#!/usr/bin/php-cgi
<?
$errorCode = $_SERVER['REDIRECT_STATUS'];
$reqUrl = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
...
访问日志包含带有错误代码的预期条目,例如 500 或 403。错误日志告诉我客户端在我的受限目录中被拒绝,这也是预期的。
但为什么错误文档文件根本不再执行呢?
Ubuntu 14.04 上的 Apache 版本为 2.2.x 到 2.4.7。
更新:conf-enabled/serve-cgi-bin.conf 已激活。这是我的 VirtualHost 配置的一部分:
<VirtualHost 1.2.3.4:80 [1:2:3::4]:80>
ServerName example.de
ServerAlias www.example.de
DocumentRoot /var/www/web001
ErrorDocument 401 /cgi-bin/error.cgi
ErrorDocument 403 /cgi-bin/error.cgi
ErrorDocument 404 /cgi-bin/error.cgi
ErrorDocument 500 /cgi-bin/error.cgi
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xhtml+xml application/x-javascript text/
SuexecUserGroup web001 webusers
ScriptAlias /cgi-bin/ /var/www/web001/cgi-bin/
AddHandler fcgid-script .php
FCGIWrapper /var/www/web001/cgi-bin/php-fcgi .php
<Directory "/var/www/web001">
Options +Includes +ExecCGI
</Directory>
</VirtualHost>
答案1
详细比较新旧默认配置发现不再包含 cgid 模块。启用后,错误 CGI 页面再次按预期工作。我想任何其他 CGI 页面也不会起作用,但我不经常使用它们,所以我没有注意到。不确定这是否是与 Ubuntu 相关的更改,或者今天是否所有 Apache 安装都未启用 CGI。
这是快速修复:
a2enmod cgid
然后重新启动阿帕奇。