似乎我是第一个想这样做的人……使用 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 文件中。