Back-End

16 jan, 2009

Função para criar URL amigável com PHP

Publicidade

Na realidade a URL tem a função de endereçar um determinado recurso na internet, um site, FTP etc. Mas como oportunidade de marketing e vendas, tornou-se importante a usabilidade, SEO (Otimização dos motores de busca) e a acessibilidade, assim gerando a melhora da experiência do o usuário.

Nesse artigo pretendo ensinar uma forma fácil de construir uma função que fique responsável por formatar a URL, tornando-a dinâmica e amigável.

Diferente das demais formas de construção de URL´s Amigáveis, essa forma trabalha com um método de “Alias” (apelidos) para determinado arquivo ou pasta e possibilita a o envio de variáveis via GET.

Obs.: Esse método está sendo aplicado da forma mais simples possível, justamente para melhor entendimento do processo.

Requerimento:

  • Conhecimentos intermediários nas diretivas do Apache;
  • Conhecimentos Intermediários em expressão Regular;
  • Conhecimentos Intermediários em PHP;
  • Apache com o mod_rewrite habilitado.

Primeiramente, criaremos um diretório onde ficará o projeto, vamos chamá-lo de projeto_1.

Dentro desse diretório criaremos três arquivos e um diretório:

  • O arquivo .htaccess, onde criaremos a regra de reescrita da url;
  • O arquivo main.php, que será responsável dela indexação do site;
  • O arquivo url_response.php, onde será codificada a função para o tratamento da url;
  • O diretório applications, onde serão guardados nossos aplicativos ex.: noticias.php, índex.php etc

No arquivo .htaccess vamos criar regras de url usando o mod_rewrite(módulo responsável por reescritas de url) do apache.

# Habilitamos o modo Rewrite

RewriteEngine on

#Aqui, criamos as regras de redirecionamento.

RewriteRule !\.(js|ico|txt|gif|jpg|png|css)$ main.php

Detalhando o arquivo .htaccess

Na diretriz RewriteEngine é possível habilitar(On) ou desabilitar(off) o modo de reescrita do apache. Em RewriteRule configuramos a regra de reescrita das urls, neste caso redirecionamos para main.php.

Feito isso vamos criar e codificar a função responsável por tratar a URL, abra o arquivo url_response.php:

<?php

	//diretório do projeto
	if(!defined(´PROJECT_DIR´))
		define(´PROJECT_DIR´, ´projeto_1´);
		
	// diretório da aplicacao
             if(!defined(´APPLICATION_DIR´))	
		define(´APPLICATION_DIR´, ´applications´);

	// URL enviado
            if(!defined(´REQUEST_URI´))	
		define(´REQUEST_URI´	,str_replace(´/´.PROJECT_DIR,´´,$_SERVER[´REQUEST_URI´]));

	 /**
               * Função Resposável pelo tratamento da URL
               *
               * @author Camilo Teixeira de Melo
               * @link http://www.camilotx.com.br
               * @param string $urlpatterns array com os modelos de url
               * @return void
              **/
	function url_response($urlpatterns){
			foreach($urlpatterns as $pcre=>$app){
				if(preg_match("@^{$pcre}$@",REQUEST_URI,$_GET)){
						include(APPLICATION_DIR.´/´.$app);
						exit();
				}else{
					$msg = ´<h1>404 Página não existe</h1>´;
				}
			}
			echo $msg;
		return;		
	}

?>

Neste trecho:

//diretório do projeto

if(!defined(´PROJECT_DIR´))

define(´PROJECT_DIR´, ´projeto_1´);

Definimos a constante PROJECT_DIR onde conterá o diretório do projeto. No trecho a seguir definimos o diretório da aplicação e a url enviada pelo browser.

// diretório da aplicacao

if(!defined(´APPLICATION_DIR´))

define(´APPLICATION_DIR´, ´applications´);

// URL enviado

if(!defined(´REQUEST_URI´))

define(´REQUEST_URI´ ,str_replace(´/´.PROJECT_DIR,´´,$_SERVER[´REQUEST_URI´]));

Por último a constituição da função url_response responsável pelo tratamento da url.

foreach($urlpatterns as $pcre=>$app){

if(preg_match(“@^{$pcre}$@”,REQUEST_URI,$_GET)){

include(APPLICATION_DIR.´/´.$app);

exit();

}else{

$msg = ´<h1>404 Página não existe</h1>´;

}

}

Aqui é criado um laço responsável por percorrer o array com as URLs padrões e procurar o arquivo na pasta de aplicações, caso exista é feito sua inclusão. Caso não exista o arquivo apresento uma mensagem de página inexistente, ou 404.

Usando a função no arquivo main.php:

<?php
           include(´url_response.php´); 
          $urlpatterns = array(
		´/´=>´index.php´,
		´/noticias´=>´noticias.php´,
		´/noticia/(?P<id_noticia>\d+)´=>´noticias.php´,
           );
          url_response($urlpatterns);
?>

O include não tem segredo. Na array $urlpatterns como o próprio nome diz refere-se aos padrões de url. O índice do array é a url e o valor é o arquivo que deve ser executado.

Exemplo:

´/´=>´index.php´

´/´ refere-se a raiz por exemplo www.dominio.com.br/ que será redirecionado ao índex.php

´/noticias´=>´noticias.php´

´/noticias´ refere-se a www.dominio.com.br/noticias onde executa o arquivo noticias.php

´/noticia/(?P<id_noticia>\d+)´=>´noticias.php´

Aqui eu usufruo da expressão regular para enviar um parâmetro com valor decimal

Via GET. A url ´/noticias/(?P<id_noticia>\d+)´ refere-se a www.dominio.com.br/noticias/12. O valor é acessado via GET para o arquivo notícias.php

Por último criamos os arquivos índex.php e noticias.php na pasta applications.

Abaixo deixo um exemplo simples dos arquivos para melhor entendimento do processo de cada arquivo.

index.php

<?php
        echo ´você está na index´;
?>

noticias.php

<?php
             i f(isSet($_GET[´id_noticia´]))
	         echo ´Exibindo a notícia de id ´ .$_GET[´id_noticia´];
            else
	          echo (´Notícias´);

?>