为什么 CGI 在 Apache 中不起作用

为什么 CGI 在 Apache 中不起作用

我得到了如下的 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_cgiSELinux 布尔值并确保 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或类似的东西之间存在冲突。我无法找到此问题的确切原因。但现在我的网站正常运行。

相关内容