Configurando CGI no Snow Leopard
Common Gateway Interface é uma tecnologia que permite criar páginas web dinâmicas com (quase) qualquer linguagem de programação.
Preliminares
Verifique se seu servidor Apache está ativo. Abra um navegador qualquer em http://localhost e deverá aparecer “It works” (no Snow Leopard). A URL http://localhost/~username/ deve mostrar uma página mais bonitinha de título “Your website.” (se você ainda não houver alterado essas páginas).
Se não aparecer nada disso, você tem de ativá-lo. Clique na maçã no canto da tela, vá em System Preferences (Preferências do Sistema) e em Sharing (Compartilhado). Clique em Web Sharing (Compartilhamento Web) e deve aparecer uma bolinha verde indiciando que o servidor está ativo. Aproveite para ver que é mostrado seu IP na rede. É esse endereço que as demais pessoas da rede devem acessar no navegador se quiserem ver o site que você está hospedando na porta 80.
Quando você precisar reiniciar o Apache, você pode desmarcar e marcar novamente o compartilhamento ou pelo comando no terminal (fornecendo a senha root quando solicitada):
sudo apachectl restart
CGI padrão
Costuma-se usar um alias (que encontra-se em /etc/apache2/httpd.conf, linha 328) dos endereços que começam por cgi-bin/ para um diretório restrito onde ficam os arquivos CGI. No Snow Leopard, vc acessa, por exemplo, http://localhost/cgi-bin/script.cgi e o arquivo que será executado será /Library/WebServer/CGI-Executables/script.cgi. Isso evita que, havendo algum erro no servidor, o arquivo seja baixado em vez de executado, o que geraria problemas de segurança (imagine se o arquivo contiver a senha da base da dados).
Essa opção já vem habilitada por padrão, apenas crie um arquivo CGI como os exemplos ao final do post, coloque-o na pasta /Library/WebServer/CGI-Executables/ e dê permissão de execussão do arquivo pelo terminal com o comando:
sudo chmod +x /Library/WebServer/CGI-Executables/meu_arquivo.cgi
Então acesse no navegador http://localhost/cgi-bin/meu_arquivo.cgi para vê-lo rodando.
CGI em Sites/
Mas às vezes você simplesmente precisa de algo mais prático, vamos então habilitar que qualquer arquivo de extensão .cgi na pasta Sites seja executado onde estiver.
Configure o arquivo /etc/apache2/users/username.conf dessa maneira (trocando sempre username pelo seu nome de usuário):
<Directory "/Users/username/Sites/"> Options Indexes ExecCGI MultiViews FollowSymLinks AddHandler cgi-script .cgi AllowOverride All Order allow,deny Allow from all <IfModule dir_module> # Esse condicional não é necessário, mas é interessante, # ele faz com que também index.cgi possa ser índice, isto # é, seja a resposta ao solicitar a URL de seu diretório. DirectoryIndex index.html index.cgi </IfModule> </Directory>
Virtual host
Podemos aproveitar e configurar um virtual host (um endereço [DNS], no caso http://devel, que é acessível por você e para quem você estiver servindo). No caso, usaremos apenas para o desenvolvimento local de websites em CGI. Crie um arquivo de nome qualquer (com extensão .conf) na mesma pasta do arquivo anterior, por exemplo /etc/apache2/users/devel.conf com o seguinte conteúdo:
<Virtualhost *:80>
# Onde o root do site se encontra no sistema:
DocumentRoot /Users/username/Sites/devel
# Endereço URL pelo qual será acessível:
ServerName devel
</Virtualhost>
E para que esse endereço seja visto como local, edite o arquivo /etc/hosts com seu editor preferido adicionando ao final:
# Desenvolvimento http://devel
127.0.0.1 devel
Para abrir o arquivo no editor padrão use o comando:
open /etc/hosts
Será requerida a senha de root ao salvar. Teste com um arquivo .html ou .cgi em http://devel.
Exemplos de arquivos CGI
Lembre-se de alguns detalhes:
- Se a linguagem usada for interpretada, a primeira linha deve apresentar o caminho para o interpretador (ou com
env) precedido de#! - Você deve sempre imprimir primeiramente o header (como o Content-Type) seguido de duas quebras de linha antes do conteúdo
- Você deve tornar o arquivo executável (chmod +x)
[Os exemplos a seguir não estão otimizados, são apenas ilustrativos].
Bash
#!/bin/bash # hello_bash.cgi echo "Content-Type: text/html" echo echo "<html>" echo "<body>" echo "<h1>Hello Bash!</h1>" echo "</body>" echo "</html>"
Ruby
#!/usr/bin/env ruby # hello_ruby.cgi puts "Content-Type: text/html" puts puts "<html>" puts "<body>" puts "<h1>Hello Ruby!</h1>" puts "</body>" puts "</html>"
C
#include <stdio.h>
int main (void)
{
printf("Content-Type: text/html\r\n");
printf("\r\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>Hello C!</h1>\n");
printf("</body>\n");
printf("</html>\n");
return 0;
}
Go
package main
import "os"
func main() {
s := "Content-Type: text/html\r\n"
s += "\r\n"
s += "<html>\n"
s += "<body>\n"
s += "<h1>Hello Go!</h1>\n"
s += "</body>\n"
s += "</html>\n"
os.Stdout.WriteString(s)
}
Divirta-se!
