• Picotando e maquiando URLs

    by  • July 25, 2006 • Apache, PHP

    Seu site funciona na base do index.php?idpag=23&idproduto=343 ?
    Cada vez que você vai passar um URL você tem que explicar o que é a “?” e esses id* da vida?

    Acabe com isso, facilite a vida do seu usuário e aumente até o acesso ao seu site com uma simples solução, mod_rewrite. Veja como implementar este módulo do Apache em seu servidor, neste post.

    Esta semana foram lançados os Blogs do site ComuniWEB, e com eles um desafio do passado voltou a tona. Como o site é base para um jornal impresso com alguma frequencia procuramos fazer uma ligação chamando a atenção do leitor para o site. No passado isso era feito passando um longo URL “index.php?idpaginas=20&idmaterias=123456″, mas isso é um grande problema pra que lida no dia a dia com usuários leigos que nao entendem o que esta informação significa.

    Mesma coisa com os blogs, acessar um endereço do tipo “blog.php?id=fulanosilva” não é nada intuitivo, imaginem acessar os posts antigos deste blog sem usar os conhecidos “permalinks”. A navegação se torna muito mais intuitiva, gerando mais acessos e melhorando o entendimento de logs de acesso.

    O processo é simples (agora que consegui enteder :D ) você habilita o mod_rewrite, determina as condições e por fim determina como deve ser re-escrito o URL. Claro que na teoria tudo é lindo e fácil, na prática o trabalho sempre é maior.

    Primeiro verifique se seu servidor possui o mod_rewrite habilitado no Apache: use um phpinfo(); e verifique a linha “Loaded Modules” da configuração Apache. Caso esteja habilitado podemos seguir em frente, como ilustração vamos desenvolver o exemplo citado abaixo:

    URL Original: http://www.domain.com/fulanodetal
    URL Final: http://www.domain.com/blog.php?id=fulanodetal

    Desta forma o usuário terá uma forma mais rápida de acessar o blog de Fulanodetal.

    O servidor deve estar configurado para aceitar arquivos do tipo .htaccess em diretórios, este arquivo permite setarmos configurações extras ou diferenciadas no Apache para esta pasta em específico. É neste arquivo que vamos carregar as configurações. Vou mostrar a estrutura final do arquivo e depois explicar cada pedaço.

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule ^([^/]*)$ blog.php?id=$1 [L]

    Na linha 1 indicamos que nesta pasta devemos ativar o mod-rewrite.
    Nas linhas 3 e 4 setamos as condições onde a regra da linha 6 deve ser usada.
    Na linha 6 finalmente, falamos o que deve ser feito com a url.

    Condições:
    Estas condições devem ser respeitadas para que a URL seja re-escrita, neste caso temos duas condições baseadas em flags do CondPattern. Nestas diretivas usamos uma syntaxe Perl de expressões regulares com algumas adições.
    O flag !-f se trata da negação do flag -f que indica se o “alvo” é um arquivo válido no servidor
    O flag !-d se trata da negação do flag -d que indica se o “alvo” é um diretório válido no servidor
    Com isso estabelecemos que se o URL aponta para algo que não seja um arquivo válido ou diretório, ou seja, algo que não existe no servidor, devemos usar a regra em seguida para re-escrever a URL.

    Regras de re-escrita:
    O comando RewriteRule é o mais importante do grupo, é ele que efetua a re-escrita jogando os elementos nos seus lugares
    Neste caso usamos primeiro uma expressão regular para definir os trechos do nosso URL importantes. Quem já sou expressão sabe que cada texto compatível com uma expressão entre ( ) irá retornar como um item $1, $2 após aplicada a expressão. Sabendo isso podemos verificar que a expressão captura tudo que vai além do nosso url, pois o arquivo .htaccess esta na raiz de nossa estrutura de arquivos do servidor.

    Pegando tudo que vai além do / em nosso exemplo pegamos fulanodetal e em seguida a expressão mostra onde isso será usado concatenando “blog.php?id=” com $1 (o primeiro match da expressão, fulanodetal). e finalmente após a expressão temos FLAGS especiais, sempre entre [ ] que indicam várias regas, neste caso L significa que está é a última regras a ser aplicada, pulando com isso qualquer outra coisa que estiver no arquivo.

    De uma forma geral esta é a estrutura do mod_rewrite, os comandos possuem ainda uma vasta gama de flags e condições que podemos usar, verifique abaixo alguns links que podem ajudar:

    Cheatsheet:
    http://www.ilovejackdaniels.com/apache/mod_rewrite-cheat-sheet/
    Documentação oficial:
    http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
    Ferramenta para escrever regras de re-escrita (Wizard)
    http://www.mod-rewrite-wizard.com/

    About

    Rafael Dohms is a PHP Evangelist, Speaker and contributor. He is a very active member of the PHP Community, having helped create and manage two PHP User Groups in Brazil. He shared the lead of PHPSP for 3 wonderful years making a positive mark on the local market. Developer, gamer and lover of code he also hosts Brazil’s first PHP Podcast: PHPSPCast, as well as contributing to well known projects. He moved to the Netherlands in search of new challenges and is now part of the team at WEBclusive, sharing his passion for quality code and working on new awesome ideas with the team. You can always find him at the nearest Community events, speaking, sharing, talking or just learning from the rest.

    http://doh.ms