Executando um arquivo sem extensão como script CGI outside / cgi-bin

4

Parece que eu sou a primeira pessoa a querer fazer isso ... Foi muito fácil de resolver com o lighttpd, mas com o apache isso parece impossível. Basicamente eu quero rodar um arquivo cgi sem extensão outsite cgi-bin. Agora, infelizmente, o apache o ignora se eu definir o nome do arquivo em AddHandler cgi-script filename . A outra opção é marcar todo o diretório usando SetHandler cgi-script , mas ignora os arquivos estáticos nesse diretório e nos subdiretórios.

Como faço para convencer o apache 2.4 a tratar um arquivo exato como um arquivo CGI?

    
por Daniel Ziltener 19.04.2013 / 00:56

2 respostas

3

Esta é a solução:

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

Adicione isto à seção do httpd.conf onde as configurações do diretório correspondente estão definidas.

    
por 19.04.2013 / 23:17
1

Aqui está uma solução geral que tratará qualquer arquivo sem extensão como um script:

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

Como você esperaria, isso ignora os nomes das pastas sem extensão. Apenas arquivo nomes que correspondem à regex são tratados com o manipulador "cgi-script". A desvantagem é que, se você der nomes que não possuem extensões para arquivos que não sejam de script (ou seja, estáticos), em qualquer diretório em que essa diretiva esteja ativa, ele fornecerá um Erro interno do servidor. Mas esse é um preço muito pequeno a pagar.

Além disso, você pode tornar um arquivo sem extensão a página padrão nessa pasta - por exemplo, se apenas o nome do diretório for digitado na janela de endereço do navegador - usando DirectoryIndex. Isso é útil se, por exemplo, você quiser executar um script perl (chamado "show" neste exemplo) que imite o comportamento do php: cada página * .html na pasta pode ser um modelo e "mostrar" é o script que imprime os modelos.

DirectoryIndex show

Em seguida, se o usuário digitar link , o servidor executará o programa "show" e no $ ENV {PATH_INFO}, você terá o valor "/content.html", que pode ser usado para abrir o modelo.

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();

Um exemplo de muitos usos para esse comportamento. Por anos eu não usei um diretório cgi-bin separado para scripts, porque eu acho que parece estúpido na barra de endereços, e eu não gosto de adicionar ".pl" ou ".cgi" aos meus programas, como eu não faço. Não quero dar aos visitantes potencialmente mal-intencionados mais informações do que eu preciso. A configuração acima é agora o padrão no meu servidor.

Deve-se observar que você pode adicionar essas duas diretivas ao arquivo httpd.conf ou ao arquivo .htaccess por diretório, se estiver usando hospedagem compartilhada.

    
por 19.04.2017 / 08:08