Implementando Url Amigáveis no PHP – Tutorial

E ae pessoal! Tudo certo?

No tutorial da semana vamos falar sobre URL Amigáveis, aqui no Hardcódigo você pode notar que as URLs são montadas de forma a facilitar a leitura e identificação do link que você está visitando atualmente. Isso ajuda a indexação pelos buscadores e facilita para o usuário encontrar o link em seu histórico.

Exemplo de URL comum:
http://www.hardcodigo.com.br/pagina.php?id=1&codigo=234

Exemplo de URL amigável:
http://www.hardcodigo.com.br/pagina/conteudo-interessante

Para implantarmos URL Amigáveis precisamos que o “mod_rewrite” esteja habilitado no servidor. Com o módulo em questão devidamente habilitado vamos a configuração da URL.

1. .htaccess
O primeiro passo é criar um arquivo .htaccess na raiz do nosso site.
Os arquivos .htaccess são arquivos de acesso e configuração do Apache, são arquivos lidos pelo Apache toda vez que você tenta acessar um arquivo que esta dentro de uma pasta (ou sub pastas) onde exista um arquivo .htaccess

Dentro desse arquivo .htaccess vamos colocar o seguinte conteúdo:

<IfModule mod_rewrite.c>
    RewriteEngine On
	RewriteRule ^home/?$ /index.php [NC,L]
</IfModule>

2. Como é que isso funciona?

Na primeira e ultima linha estamos verificando se o módulo mod_rewrite está ativo, se estiver ele irá executar o redirecionamento. A segunda linha serve para habilitar o sistema de rescrita de URL, com ele montaremos a nossa URL amigável.

A linha que realmente define a URL é a seguinte:
RewriteRule ^home/?$ /index.php [NC,L]

RewriteRule – Esse é o comando que significa Regra de Reescrita, isso avisa o Apache que nessa linha teremos uma instrução de reescrita de URL.

^home/?$ – 
Expressão regular que será utilizada para validar a URL, aqui o circunflexo (^) significa “começo” e o cifrão ($) significa “fim”. Nessa expressão a barra e o ponto de interrogação (/?) significam que a barra é opcional, ou seja, irá redirecionar no caso de hardcodigo.com.br/home ou hardcodigo.com.br/home/
Para quem quer conhecer melhor expressões regulares fica a dica: http://aurelio.net/regex/guia/

/index.php – Url para qual o visitante será direcionado ao acessar a página /home

[NC,L] – Por fim temos as flags. Nessa regra utilizamos o NC de “no case” (não faz diferença entre maiúsculas e minúsculas) e temos o “L” de “Last” (se essa regra for utilizada, nenhuma outra regra seja usada). Para mais informações sobre as flags: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

Pronto! Assim quando o usuário acessar o endereço configurado ele será redirecionado para o index.php e na barra de endereços ficará hardcodigo.com.br/home

3. Trabalhando com variáveis
E quando precisamos carregar dinamicamente um conteúdo por sua identificação?
Vamos imaginar que temos uma página de notícias, nessa página várias noticias são exibidas e queremos definir uma URL amigável para esses links, como proceder?
Aqui temos duas opções, podemos criar um link permanente para cada notícia (WordPress trabalha dessa forma) ou podemos melhorar a URL porém continuar passando o ID pela URL.

Link permanente:
http://hardcodigo.com.br/noticia/tutorial-novo-no-hardcodigo

URL “trabalhada”:
http://hardcodigo.com.br/noticia/1/tutorial-novo-no-hardcodigo

E você pode perguntar, qual a diferença?
No primeiro iremos identificar qual notícia carregar através do seu link permanente que precisa ser exclusivo. Para isso no cadastro de notícias você precisa criar um campo link permanente que irá armazenar “tutorial-novo-no-hardcodigo”
Já no segundo o ID da notícia continua na URL, então o nome logo após o número 1 é apenas para facilitar a compreensão da URL e sua indexação por buscadores.

Qual a melhor? Você decide!

Para trabalharmos com a primeira URL o código será:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^noticia/([a-z0-9-]+)/?$ /noticia.php?link=$1 [NC,L]
</IfModule>

Vocês podem notar que a linha da regra de reescrita está um pouco diferente agora:
RewriteRule ^noticia/([a-z0-9-]+)/?$ /noticia.php?link=$1 [NC,L]

Na parte da expressão regular “^noticia/([a-z0-9-]+)/?$” o “([a-z0-9-]+)” significa “no mínimo uma letra minúscula de a – z OU letra maiúscula de A – Z OU número de 0 a 9 OU um hífen -
E logo em seguida essa variável em questão que atende os requisitos e é capturada aqui é passada na URL link=$1

Para o caso de você preferir trabalhar com o ID na URL a linha seria alterada para:
RewriteRule ^noticia/([0-9]+)/([a-z0-9-]+)/?$ /noticia.php?id=$1 [NC,L]

Onde a expressão: “([0-9]+)” significa “no minimo um número 0 a 9”.

Depois nos dois casos basta no PHP ler a respectiva variável ID ou LINK.
Ex: $_GET[‘link’] no primeiro exemplo irá retornar o link permanente.

Obs: é muito importante que você trate esses dados antes de realizar consultas no banco de dados, para o caso do ID podemos usar o intval() para retornar apenas um número da variável enviada. Já para o link podemos trabalhar com o mysql_real_escape_string().

Essa foi uma breve explicação sobre URLs Amigáveis, existem muitas outras configurações e opções para trabalhar com URL, mas agora que vocês já viram como começar tudo fica mais fácil!

Na semana que vem vamos falar sobre SQL Injection, seus riscos e como proteger seus códigos.
Até a próxima!

Publicado por

Felipe Do E. Santo

Professor, Mozilla Tech Speaker, Mozilla Rep, Desenvolvedor Web e Gamer nas horas vagas.

7 comentários em “Implementando Url Amigáveis no PHP – Tutorial”

  1. Olá Felipe, muito boa esta sua matéria.
    Gostaria de te pedir uma ajuda pois não sou muito experiente em programação php.
    Por exemplo: em um site notícias, terei uma página onde serão listadas as chamadas das notícias. Cada chamada terá um link que levará para o detalhe da notícia.
    Como posso estruturar este detalhe? Se as notícias forem segmentadas por ano/mes/nome-da-noticia, estas pastas deverão existir fisicamente no meu site ou terei somente uma página onde o conteúdo será dinâmico?
    No caso de serem pastas físicas, o meu cms deverá gerar estas pastas e a página “index.php” com o conteúdo do detalhe?
    Não sei se consegui explicar direito.
    Bom, caso possa me esclarecer agradeço muito.

    Obrigado pela sua atenção.
    Marcel.

    1. Olá Marcel,

      Você irá tratar todo o conteúdo em uma página apenas, cada link será mapeado para passar uma variável via GET para o PHP que então irá carregar a notícia deseja. Para garantir o acesso será necessário criar uma estrutura única de ano, mês e nome da notícia. Assim você pode encontrar a notícia usando esses parâmetros. Por exemplo no .htaccess:

      RewriteRule ^noticia/(.+)/(.+)/(.+)/?$ noticia.php?ano=$0&mes=$1&titulo=$2 [NC,L]

      E lá no PHP você trabalha as variáveis e encontra a notícia necessária!
      Espero que tenha ajudado.

      Abraço!

  2. Boa noite Felipe. Eu estou tentando fazer um acesso da seguinte forma:

    meusite.com.br/email1 -> direciona para um php que exibe as informacoes do email1
    meusite.com.br/email2 -> direciona para um php que exibe as informacoes do email2

    Mas estou tendo dificuldade, poderia me dar uma luz?

    1. Olá Anderson!
      Direto assim meusite.com.br/email1 acho que seria difícil, pois ele pegaria toda URL na regra.
      Você não pode usar meusite.com.br/email/email1 e etc?

      Você trabalharia com algo nessa linha:
      RewriteRule ^email/([a-z0-9-]+)/?$ /email.php?email=$1 [NC,L]
      E ai no PHP recuperaria o e-mail usando o $_GET[‘email’]

  3. Olá amigo
    Eu quero fazer isso em um site que estou passando para PHP, sou iniciante.
    Eu criei um campo no banco de dados chamado “permalink”, que contem a url amigável.
    A estrutura do site está por categorias, hotelaria, turismo, gastronomia e etc

    http://www.testesite.com/hotelaria.php?id=4
    http://www.testesite.com/turismoemercado.php?id=50

    Queria que os links ficassem assim:
    http://www.testesite.com/hotelaria/hotel-de-gramado
    http://www.testesite.com/gastronomia/restaurante-em-sao-paulo
    Sendo que, eu já tenho arquivos separado no site que exibe o conteúdo de cada categoria, gastronomia.php, turismoemercado.php, turismo.php passando variavel ID.
    E cada diretório, terá as pastas amigáveis criadas, de acordo com cada categoria
    Como eu faço essa URL amigável? Tenho que usar apenas um arquivo para exibir o conteúdo de todas as categorias? ou posso manter os arquivos separados por seção?

    1. Olá Anderson,

      Uma opção que pode lhe ajudar seria informar na URL o id que você deseja carregar.
      Por exemplo: http://www.testesite.com/hotelaria/hotel-de-gramado/4 Ou http://www.testesite.com/hotelaria/4/hotel-de-gramado

      E depois ler essa variável id usando as regras conforme o artigo demonstra. Se você quiser utilizar o campo “permalink” para os apontamentos acredito que seria necessário criar um arquivo único e esse arquivo será o responsável pelas rotas e por redirecionar o usuário para o conteúdo adequado.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.