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!

Felipe Do E. Santo

Fundador do Hardcódigo, Desenvolvedor Web, Professor, amante de café, usuário do Firefox OS, Gamer e Youtuber nas horas vagas.

3 thoughts to “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!

Deixe uma resposta

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