看来我是第一个想做这个的人…用lighttpd解决起来真的很容易,但是用apache这个看起来是不可能的。 基本上我想运行一个cgi文件没有扩展outsite cgi-bin。 现在不幸的是,如果我在AddHandler cgi-script filename下设置文件名,apache会忽略它。 另一种select是使用SetHandler cgi-script标记整个目录,但是忽略该目录和子目录中的静态文件。
我如何说服apache 2.4把一个确切的文件作为一个CGI文件?
这是解决scheme:
<FilesMatch filename$> SetHandler cgi-script </FilesMatch>
将其添加到httpd.conf中定义相应目录设置的部分。
这是一个通用的解决scheme,将任何没有扩展名的文件视为脚本:
<FilesMatch "^[^\.]+$"> SetHandler cgi-script </FilesMatch>
正如你所希望的,这将跳过没有扩展名的文件夹名称。 只有匹配正则expression式的文件名才会被“cgi-script”处理程序处理。 缺点是,如果你给没有非脚本(即静态)文件扩展名的名字,在这个指令被激活的任何目录中,它会给你一个内部服务器错误。 但这是一个非常小的代价。
另外,你可以把一个没有扩展名的文件作为该文件夹中的默认页面 – 也就是说,如果在浏览器的地址窗口中只input目录的名字 – 使用DirectoryIndex。 例如,如果您想要运行一个模拟php行为的perl脚本(在本例中称为“show”),那么这很有帮助:文件夹中的每个* .html页面可以是模板,“show”是打印模板的脚本。
DirectoryIndex show
然后,如果用户键入http://example.com/path-to-show/show/content.html ,服务器将运行“显示”程序,在$ ENV {PATH_INFO}中,您将拥有值“/content.html”,然后您可以使用它打开模板。
show.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”我想给潜在的恶意访问者提供比我更多的信息。 上面的configuration现在是我的服务器上的默认configuration。
需要注意的是,如果您使用的是共享主机,则可以将这两个指令都添加到httpd.conf文件中,或者添加到每个目录的.htaccess文件中。