在 /cgi-bin 之外以 CGI 脚本形式运行无扩展名的文件

在 /cgi-bin 之外以 CGI 脚本形式运行无扩展名的文件

似乎我是第一个想这样做的人……使用 lighttpd 很容易解决,但使用 apache 似乎不可能。基本上我想运行一个没有扩展名 outsite cgi-bin 的 cgi 文件。现在不幸的是,如果我将文件名设置为 ,apache 会忽略它AddHandler cgi-script filename。另一个选项是使用 标记整个目录SetHandler cgi-script,但这样一来,它会忽略该目录和子目录中的静态文件。

我如何说服 apache 2.4 将一个精确的文件视为 CGI 文件?

答案1

这是解决方案:

<FilesMatch filename$>
    SetHandler cgi-script
</FilesMatch>

将其添加到 httpd.conf 中定义相应目录的设置的部分。

答案2

这是一个通用的解决方案,它将任何没有扩展名的文件视为脚本:

<FilesMatch "^[^\.]+$">
  SetHandler cgi-script
</FilesMatch>

正如您所希望的那样,这将跳过没有扩展名的文件夹名称。只有文件与正则表达式匹配的名称由“cgi-script”处理程序处理。缺点是,如果您为非脚本(即静态)文件提供没有扩展名的名称,则在该指令有效的任何目录中,它将为您提供内部服务器错误。但这是很小的代价。

此外,您可以使用 DirectoryIndex 将无扩展名文件设为该文件夹中的默认页面(即,如果在浏览器的地址窗口中仅输入目录名称)。例如,如果您想运行一个 perl 脚本(本例中称为“show”)来模仿 php 的行为,这将非常有用:文件夹中的每个 *.html 页面都可以是一个模板,而“show”是打印模板的脚本。

DirectoryIndex show

然后,如果用户输入http://example.com/path-to-show/show/content.html,服务器将运行“show”程序,并且在 $ENV{PATH_INFO} 中,您将获得值“/content.html”,然后您可以使用该值来打开模板。

显示.pl:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
use Text::Template;
($page = $ENV{PATH_INFO}) =~ s/^\///; # not very secure, here for example only
print Text::Template->new(TYPE => 'FILE', SOURCE => $page)->fill_in();

此行为的众多用途之一。多年来,我一直没有为脚本使用单独的 cgi-bin 目录,因为我认为它在地址栏中看起来很愚蠢,而且我不喜欢在我的程序中添加“.pl”或“.cgi”,因为我不想向潜在的恶意访问者提供超出我需要的信息。上面的配置现在是我服务器上的默认配置。

值得注意的是,如果您使用共享主机,则可以将这两个指令都添加到 httpd.conf 文件中,或者按目录添加到 .htaccess 文件中。

相关内容