Назад | Перейти на главную страницу

Запуск файла без расширения как CGI-скрипта вне / cgi-bin

Похоже, что я первый, кто хочет это сделать ... Это было действительно легко решить с помощью 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 для каждого каталога, если вы используете общий хостинг.