Похоже, что я первый, кто хочет это сделать ... Это было действительно легко решить с помощью lighttpd, но с apache это кажется невозможным. В основном я хочу запустить cgi-файл без расширения вне cgi-bin. Теперь, к сожалению, apache игнорирует его, если я устанавливаю имя файла в AddHandler cgi-script filename
. Другой вариант - пометить весь каталог с помощью SetHandler cgi-script
, но тогда он игнорирует статические файлы в этом каталоге и в подкаталогах.
Как мне убедить apache 2.4 обрабатывать один конкретный файл как файл CGI?
Это решение:
<FilesMatch filename$>
SetHandler cgi-script
</FilesMatch>
Добавьте это в раздел httpd.conf, где определяются настройки соответствующего каталога.
Вот общее решение, которое будет рассматривать любой файл без расширения как скрипт:
<FilesMatch "^[^\.]+$">
SetHandler cgi-script
</FilesMatch>
Как и следовало ожидать, при этом пропускаются имена папок без расширения. Только файлимена, соответствующие регулярному выражению, обрабатываются обработчиком cgi-script. Обратной стороной является то, что если вы дадите имена, не имеющие расширений для файлов, не являющихся скриптами (то есть статическими), в любом каталоге, где активна эта директива, это выдаст вам внутреннюю ошибку сервера. Но это очень небольшая цена.
Кроме того, вы можете сделать файл без расширения страницей по умолчанию в этой папке, т.е. если в адресном окне браузера набирается только имя каталога - с помощью DirectoryIndex. Это полезно, если, например, вы хотите запустить сценарий Perl (в этом примере он называется «show»), который имитировал бы поведение php: каждая страница * .html в папке может быть шаблоном, а «показать» это сценарий, который печатает шаблоны.
DirectoryIndex show
Затем, если пользователь вводит http://example.com/path-to-show/show/content.html, сервер запустит программу "show", а в $ 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» в свои программы, как я этого не делаю. я не хочу давать потенциально злонамеренным посетителям больше информации, чем я должен. Приведенная выше конфигурация теперь используется на моем сервере по умолчанию.
Следует отметить, что вы можете добавить обе эти директивы в файл httpd.conf или в файл .htaccess для каждого каталога, если вы используете общий хостинг.