Seguindo o que está descrito aqui --- https://httpd.apache.org/docs/2.4/howto/cgi.html --- Criei um pequeno documento Perl:
#!/usr/bin/perl
print "Content-Type: text/html; charset=utf-8\n\n";
print "Hello, World.";
e chamou first.pl
. Eu também modifiquei para que pareça
#!/usr/bin/perl
print "Content-Type: text/html; charset=utf-8\r\n\r\n";
print "Hello, World.";
porque um amigo apontou que o significado de "\n" depende do sistema e o que é necessário é CR-LF CR-LF, mas os resultados são os mesmos.)
Quando eu olho localhost/~mylogin/first.pl
no navegador Chrome, recebo a seguinte saída:
Content-Type: text/html; charset=utf-8
Hello, World.
(O ; charset=...
material é uma ligeira modificação do que os documentos do Apache sugerem, porque deixá-lo de fora também produziu uma linha de saída Content-Type, e algumas pesquisas sugeriram que o charset pode ser importante. Acontece que não fez diferença.)
As referências dos documentos do Apache dizem "onde quer que você coloque seu arquivo, você verá uma linha Hello, World.
aparecer na janela do navegador".
Claramente, estou vendo duas linhas, a primeira das quais deveria ter sido tratada apenas como descrição do conteúdo restante, e acho que isso é um problema.
Espero que seja algum erro realmente básico e gostaria de receber qualquer sugestão.
Contexto
Estou em um Mac rodando Monterey 12.6.6
Comecei a seguir as instruções daqui .
A partir do httpd.conf
arquivo vanilla, fiz apenas algumas edições, descomentando o seguinte:
LoadModule perl_module libexec/apache2/mod_perl.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf
E em /etc/apache2/extra/httpd-userdir.conf
, eu descomentei
Include /private/etc/apache2/users/*.conf
Eu criei /etc/apache2/users/mylogin.conf
e dei a ele este conteúdo:
<Directory "/Users/mylogin/Sites/">
AddLanguage en .en
AddHandler perl-script .pl
PerlHandler ModPerl::Registry
Options Indexes MultiViews FollowSymLinks ExecCGI
AllowOverride None
Require host localhost
</Directory>
eu corri
chmod +a "_www allow execute" ~
[em todos os casos acima, substituí "mylogin" pelo meu login real, é claro]
E então, seguindo as instruções do Apache, adicionei isso ao httpd.conf
arquivo:
<Directory "/Users/mylogin/Sites">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
Com
AddHandler perl-script .pl
, você não executa o script commod_cgid
(ou ) de que tratamod_cgi
o " Tutorial do Apache: Conteúdo Dinâmico com CGImod_perl
", mas com . Embora ambos possam executar scripts Perl, é o CGI que espera que o script envie primeiro os cabeçalhos separados por\n\n
do corpo.Você pode ver a diferença alternando entre estas configurações:
mod_perl
Produz:
mod_cgid
Produz:
Seguindo a resposta de @Esa Jokinen, fiz as coisas funcionarem, no sentido de que o carregamento
http://localhost/~jfh/first.pl
produziu o resultado esperado de uma linha, mas achei que valeria a pena registrar o estado de configuração final, porque exigia alguns ajustes.Para revisar: comecei seguindo as instruções daqui .
A partir do
httpd.conf
arquivo vanilla, fiz apenas algumas edições, descomentando o seguinte:E em
/etc/apache2/extra/httpd-userdir.conf
, eu descomenteiEu criei
/etc/apache2/users/jfh.conf
e dei a ele este conteúdo:eu corri
[em todos os casos acima, meu login é
jfh
, e se você quiser copiá-lo, precisará alterá-lo para seu próprio login]Não fiz mais edições no arquivo conforme descrito na minha pergunta original, mas fiz as edições mostradas acima em .
httpd.conf
/etc/apache2/users/jfh.conf
Espero que isso ajude alguém com problemas comparáveis em um sistema comparável.
Finalmente, uma preocupação que eu tinha sobre a diferença entre
\r\n
e\n
em várias versões perl parece ter sido equivocada, pois meufirst.pl
arquivo se parece com issoe funciona bem (mas também confirmei que funciona bem quando é
\n\n
substituído por\r\n\r\n
).