我有一个基于 Apache 的 Web 服务器,每年都会有人来维护几次。为此,我保留了一个本地镜像,这样我就可以完成所需的操作,然后上传更改。
我很久没有使用 Apache 做其他事情了,而且自从上次升级我的工作站以来,我不得不安装它。我有一个.conf
文件,我把它放进去/etc/httpd/conf.d
,这在过去从来都不是问题。
我使用的 Apache 的最后一个版本可能是 2.2,所以这次使用 2.4.18 时,我收到了关于贬值的警告NameVirtualHost
,但实际<VirtualHost>
部分似乎很好。
直到我到了我必须处理的部分,一组.cgi
脚本。在 VirtualHost .conf 中我有:
<VirtualHost *:80>
DocumentRoot /mnt/lan/foo/bar
ServerName hullabaloo.mirror
<Directory /mnt/lan/foo/bar/cgi-bin>
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
[...]
</VirtualHost>
该目录中也有一个.htaccess
具有相同效果的文件(Options +ExecCGI
),这是因为实际生产服务器配置为需要它(不是我的部门)。
无论如何,如上所述,大多数链接都很好。但是,使用脚本的表单.cgi
返回 404,在日志中我发现:
AH02811: script not found or unable to stat: /var/www/cgi-bin/search.cgi, referer: http://hullabaloo.mirror/search/index.html
当然什么也没有/var/www/cgi-bin
。它位于 中/mnt/lan/foo/bar/cgi-bin
,进程可读取,search.cgi
文件是全局可执行文件。这也是它一直从中提取本地链接的同一棵树,这就是我找到 的原因http://hullabaloo.mirror/search/index.html
。
html页面中的链接是:
<form method="post" id="searchform" action="/cgi-bin/search.cgi">
据我所记得,上次我做任何事情时(大约 6 个月前),所有这些都运行良好;我非常细心,会做出更改(该.conf
文件只是我的镜像的一部分)和/或留下注释。
这里有什么问题? /mnt/lan/foo/bar
路径中有一个符号链接,如果这在 2.4 中很重要的话。我还没有开始向随机可能性投掷飞镖。
我查看了从浏览器到服务器的请求,它肯定用作http://hullabaloo.mirror/cgi-bin/search.cgi
URL。
答案1
我不知道 apache 的以前版本是否在主/etc/httpd/conf/httpd.conf
文件中默认有这个——这实际上来自 Fedora 包。
<IfModule alias_module>
[...]
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
我可以想象在人们可以自由添加自己的文件但不能更改这个文件的情况下,这可能是一个安全问题.htaccess
,.conf
而且这些人不应该运行子进程。
无论如何,注释掉该ScriptAlias
行即可解决问题。