我得到了如下的 URL:
http://ipadress/project/cgi/sessionlogin.cgi?login=usernmae&password=somepass
但是当我打开此 URL 时,我看到的是 cgi 文件的下载操作,而不是结果。我在包含 cgi 脚本的文件夹中 (/var/www/html/project/cgi) 有 .htaccess,其中包含以下信息:
AllowOverride None
Options +Indexes +ExecCGI +MultiViews +SymLinksIfOwnerMatch
#Order allow,deny
Require all granted
Allow from all
我在虚拟主机配置中也有这部分:
ScriptAlias /cgi-bin "/var/www/html/project/cgi/"
<Directory "/var/www/html/project/cgi">
AllowOverride None
Options +Indexes +ExecCGI +MultiViews +SymLinksIfOwnerMatch
#Order allow,deny
Require all granted
Allow from all
</Directory>
但一切仍然无法正常工作。cgi 模块已启用。这是 C++ 二进制 cgi 文件。我做错了什么?
答案1
首先,设置AllowOverride None
意味着任何.htaccess
文件都将被忽略(这是一件好事,因为您已经有权访问主 Apache VirtualHost 配置)因此您不妨删除该.htaccess
文件。
其次,实际的 CGI 文件需要具有正确的权限才能由 Apache ( chmod 755
) 执行,并且如果您正在运行 SELinux,则可能需要激活httpd_enable_cgi
SELinux 布尔值并确保 CGI 文件标有httpd_sys_script_exec_t
。
答案2
虽然我的系统是 Windows 8.1 上的 Apache24,但我认为无论在哪个系统上,这个问题都是比较普遍的。我在 Windows 7 上有一个使用 Apache22 的工作配置,在 Windows 8.1 上升级到 Apache24 时,我没有做任何显著的改变。当我在 Google 上搜索这个问题时,我意识到没有通用的解决方案。显然,Apache24 没有将 my_file_extension 视为可执行文件。
此外,尽管我清除了“c:\users\appdata\local\temp”目录中的 Firefox 缓存,并从磁盘中删除了该文件,但 Firefox 仍不断从我的文件系统中提供相同的文件(即文件:\\c:\users\appdata\local\temp\the-file)。并且这种情况存在于我的每台服务器上(一台服务器位于我的主机上,另一台服务器位于另一台测试机上)。
所以我找到的解决方案(我认为更通用,至少对我有用)是使用“Module mod_actions”指令(“Action”指令)。
总结一下:我的旧配置是这样的
#for alias_module
ScriptAlias /cgi-bin/ "c:/Apache24/cgi-bin/"
# for cgi directory
# my_file_extension is ksp
<Directory "c:/Apache24/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
Addhandler cgi-script .ksp
</Directory>
新的配置如下
#for alias_module
ScriptAlias /cgi-bin/ "c:/Apache24/cgi-bin/"
# for cgi directory
# my_file_extension is ksp
<Directory "c:/Apache24/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
# then the new directive i added;
# for any file in the server root directory that has an extension .ksp
<Location />
AddHandler ksp .ksp
Action ksp "/cgi-bin/CGI_KSP.exe"
</Location>
在 apache 的 Action 指令文档中,作为示例
Example: File extension
# Files of a particular file extension
AddHandler my-file-type .xyz
Action my-file-type "/cgi-bin/program.cgi"
In this example, requests for files with a file extension of .xyz are handled by the specified cgi script /cgi-bin/program.cgi.
希望这可以帮助...
答案3
我不知道这是否是 Ubuntu 20.04 上 Apache2 的新功能,但我遇到了一个问题,我的可执行文件无法启动。相反,Apache2 会建议我下载它。
我花了一些时间才找到“解决方法”(我认为这是 Apache2 中的一个巨大错误)它会改变别名路径。
无论如何,这都失败了:
ScriptAlias /cgi-bin/ /var/www/project/cgi-bin/
我为我的网站使用了一个独特的名称,如下所示:
ScriptAlias /cgi/ /var/www/project/cgi-bin/
而且效果非常好!!!
我认为不同的<VirtualHost ...>
使用相同ScriptAlias
或类似的东西之间存在冲突。我无法找到此问题的确切原因。但现在我的网站正常运行。