Ajuda - Busca - Membros - Calendário
Versão Completa: Migrando Para Urls Amigáveis
Fórum WMO > Negócios & Oportunidades > Retorno Financeiro > Técnicas de Divulgação e Otimização
SuperEly
Este artigo se destina a fornecer o conhecimento necessário para implementação de uma técnica capaz de melhorar o posicionamento de seu site nas ferramentas de buscas por meio do uso de urls amigáveis aos buscadores. O objetivo não é fornecer um script pronto para ser colocado em cada site, mas sim dar uma idéia clara de como isso pode ser feito.

Vejam o exemplo de uma url comum:

www.site.com/materia.php?id=125

Por meio dessa url o webmaster pode identificar facilmente que deve exibir nesta página a matéria de número 125, mas o problema é a dificuldade que os buscadores têm para indexá-la. Digo isso por experiência própria com este fato já notório na comunidade. Uma página que depende de argumentos não é indexada facilmente e, no geral, não alcança posições tão boas quanto poderia nos resultados das buscas.

A solução é migrar deste formato para um otimizado para buscadores. Existem diversos meios de se alcançar o mesmo resultado, mas vou ensinar aqui a técnica que oferece mais controle. Seu site precisa estar em um servidor web Apache (o mais comum) para utilizá-la.

Para não fazer um artigo gigante vou apenas exemplificar o processo de migração em um site fictício de exemplo. Vamos lá!

Sabemos que é preciso passar aquele número, 125, para sabermos qual matéria exibir. Então nós vamos deixar funcional a seguinte url, em substituição àquela:

www.site.com/materia/125/peixes_africanos

Essa url se reveste de duas vantagens: não passa argumentos da forma tão repudiada pelos buscadores e pode trazer o título da página na url. Este segundo elemento é apenas um adicional benéfico, mas não imprescindível. Se uma das palavras da busca for encontrada na url, seu site ganhará muitas posições.

Agora chega de introdução e vamos ao método em sí!

Você vai encontrar no diretório principal do seu site, seja o "public_html" ou "www" (o local onde estão suas páginas) um arquivo chamado ".htaccess". É isso mesmo, ele não tem nome, apenas extensão. Se não existir, crie este arquivo. Nele você deve escrever o seguinte:

CODE
RewriteEngine on
RewriteRule !\.(gif|jpg|png|css)$ controle.php

São apenas duas linhas. Se o arquivo já existir e houver alguma coisa nele, adicione estas linhas logo no início.

A primeira linha habilita o uso do "mod_rewrite" no seu site. A segunda direcionada todo o tráfego (com exceção de arquivos gif, jpg, png e css) para uma determinada página, neste exemplo, "controle.php".

Agora, se você digitar no navegador algo como:

www.site.com
www.site.com/nada
www.site.com/texto/semsentido

Tudo isso vai cair em "controle.php". Esta se tornou sua página mais importante e é ela quem vai tratar e direcionar todo o tráfego dentro do seu site, mas vamos fazer com que tudo isso aconteça apenas nos bastidores. O que faremos é usar a url digitada como se fosse uma string e extrair dela o que for útil. Veremos como escrever em "controle.php" um bom código de tratamento para podermos usar as tão almejadas urls amigáveis!

Nosso site exemplo tem matérias e notícias, e nós vamos utilizar ambos. As urls vão seguir o seguinte padrão:

www.site.com/materia/125/peixes_africanos

www.site.com/noticia/523/oceano_secou

Nós vamos aproveitar dessas urls apenas a seção (materia ou noticia) e a id (125 e 523, no caso). O resto (peixes_africanos e oceano_secou) está lá apenas para ajudar nas buscas e não será de serventia para o processo. Siga o modelo:

CODE
<?php

// Capturamos a url digitada
$url_site = $_SERVER['REQUEST_URI'];

// Convertemos em array quebrando a string nos pontos certos
$urln = explode("?", $_SERVER['REQUEST_URI']);
$urlt = explode("/", $urln[0]);

// Para manter a compatibilidade com as urls antigas, vamos
// verificar existência do arquivo solicitado propriamente dito
if(is_file($urlt[1])){
 include($urlt[1]);
 exit();
}

// Ja vimos que nao e um arquivo existente, entao prosseguimos
// tratando a url digitada em forma de array
$url=strip_tags($_SERVER['REQUEST_URI']);
$url_array = explode("/", $url);

// Excluimos o primeiro elemento, que sempre será vazio
array_shift($url_array);

// Se a array ficou vazia, mandamos ver no index.php
if(empty($url_array) or $url_array[0] == ""){
 include("index.php");
 exit();
}

// Se restou algo nela, vamos carregar o arquivo correto.
// Adaptacoes possivelmente so precisarao ser feitas nesta
// parte do código
else {

 // Materia
 if ($url_array[0] == "materia") {
   // capturamos a id passada na url
   $id = $url_array[1];
   // carregamos o arquivo real
   include("materia.php");
 }
   
 // Noticia
 elseif ($url_array[0] == "noticia") {
   // capturamos a id passada na url
   $id = $url_array[1];
   // carregamos o arquivo real
   include("noticia.php");
 }

 // Se nao for nenhuma das opcoes acima, carregamos a index mesmo
 else {
   include("index.php");
 }

 exit();
}

?>


Tá bom, o código está comentado mas merece alguma explicação. Apenas para ressaltar, se alguém estiver voando na leitura, isso é o que vai em "controle.php".

No início do código nós verificamos se existia o arquivo procurado na url, e neste caso carregamos ele. Isso para manter a compatibilidade com as urls que você já possui indexadas nos buscadores.

Passada esta fase, quebramos a url pelas barras ("/") existente e criamos um array que se parece com o seguinte:

www.site.com/materia/125/peixes_africanos
$url_array[0] = "materia"
$url_array[1] = "125"
$url_array[2] = "peixes_africanos"

Entretanto, só nos interessaram os dois primeiros elementos. Com eles carregamos o arquivo apropriado com base na leitura da url, no exemplo, "materia.php" ou "noticia.php", ambos existentes em nosso site fictício. No que se refere ao argumento, ou seja, a "id" da matéria ou notícia que vamos apresentar, perceba que colocamos esse dado na variável "$id". Bastará fazer a leitura dela onde for necessário.

Agora vamos saber o que muda no arquivo real que chamamos a partir do controle, ou seja "materia.php", "noticia.php" ou qualquer outro:

1) Perceba que você pode utilizar "$_GET['id']" apenas para manter a compatibilidade, porque se for uma requisição pela nova url, nós vamos pegar esse dado da variável chamada "$id". Então você vai verificar se existe algo em "$_GET['id']" e se não houver, fará o mesmo com a variável "$id", pois o argumento estará em um dos dois.

2) A segunda e última mudança diz respeito ao formato dos links para arquivos ou exibição de imagens. Nossas novas urls utilizam algumas barras, e isso indica mudança de diretório. Logo, precisamos voltar sempre à rais com uma "/" antes dos links. Observe os exemplos:

De: <a href="index.php">
Para: <a href="/index.php">

De: <img src="imagens/seta.gif">
Para: <img src="/imagens/seta.gif">


O método em sí está pronto! A intenção deste artigo não é fornecer um script milagroso que possa ser copiado e colado em qualquer site, pois isso seria utopia. O que forneço aqui é o conhecimento necessário para que cada faça a implementação da melhor forma.

Para conseguir esta última parte da url, por exemplo, basta fazer um tratamento da string trocando espaços por "_" e substituindo também a acentuação e os caracteres especiais.

www.site.com/noticia/523/oceano_secou

Use a criatividade. Você pode também criar urls assim:

www.site.com/noticia/523/oceano_secou.html

www.site.com/noticia/523/oceano_secou/oceano_secou.html

Isso porque as ferramentas de busca atribuem um peso diferente para as palavras encontradas na url em diretórios ou arquivos, e essa parte da url não será útil para o script mesmo.

Você deve trocar todos os links do seu site pelo novo formato para que surta efeito, e se quiser manter algum diretório sem o controle de url basta desativar o mod_rewrite criando nele um arquivo ".htaccess" com o seguinte conteúdo:

CODE
RewriteEngine off


Em caso de dúvidas ou dicas de melhorias sintam-se livres para postar neste tópico, o qual será aperfeiçoado ao longo do tempo com o surgimento de vantagens a serem acrescentadas no texto.

Flw!
klango
SuperEly geralmente em meus site não trabalho com "id", veja como faço:

Crio uma página index.php com uma tabela com 100% e dentro dela outra com 780px e três linhas.
Na primeira coloco um include para o top.
Na segunda coloco este código:
CODE
<?php
    $x = eregi("http|ftp|https|www|wget", $_GET["area"]);

if ($x)
    $pagina="paginadefault.php";
else
       $pagina=$_GET["area"].".php";


if($_GET["area"] == "")
$pagina = "inicio.php";
     
include($pagina);
?>


Que vai fazer a Query
e no fim um include para a base do site.

Minhas URLs ficam assim:
?area=minha_pasta/meu_arquivo

Como será a adapdação para este formato?


t+
SuperEly
Olá klango!

O que você faz é um tratamento da url nesta segunda linha da tabela. Para isso você recebe em forma de argumento tanto a área quanto a página a ser acessada.

Para adaptar ao novo modelo você vai continuar fazendo o tratamento da url para saber que arquivo carregar, mas fará isso no "controle.php". Você poderia usar urls mais ou menos assim:

De: http://www.e-teologia.com.br/?area=mapas_biblicos

Para: http://www.e-teologia.com.br/mapas_biblicos


De: http://www.e-teologia.com.br/?area=estudos_biblicos/estudos

Para: http://www.e-teologia.com.br/estudos_biblicos/estudos


E o código exemplo fornecido no primeiro post será mais simples no seu caso. Veja como ficaria a parte final dele:

CODE
// Se restou algo nela, vamos carregar o arquivo correto.
// Adaptacoes possivelmente so precisarao ser feitas nesta
// parte do código
else {

 if ($url_array[1] != "") {
   include($url_array[0] . "/" . $url_array[1] . ".php");
 }
 elseif ($url_array[0] != "") {
   include($url_array[0] . ".php");
 }
 else {
   include("inicio.php");
 }

 exit();

}


Assim funcionaria legal. thumbs_up.gif
klango
SuperEly olha o que fiz, peguei o código que postou mudei a última parte de acordo com o novo código que postou, salvei como controle.php e inclui na segunda linha no lugar de meu código anterior.

troquei o link de:
?area=teologia_sistematica
Para:
/teologia_sistematica

mas não deu certo.
SuperEly
Ah, sim. Esqueci desse detalhe. Mas como seu site não é tão complexo como o previsto quando escrevi o artigo, vou lhe passar o procedimento completo para ele:

1) Usando o novo sistema você não vai precisar mais da sua "index.php", porque essa função será da "controle.php". Mas deixe o index lá.

2) Como você carrega primeiro o topo da página, depois o conteúdo (aqui o importante) e depois o rodapé, você fará isso em "controle.php" mesmo. Para isso você teria o código completo mais ou menos assim:

CODE
<?php

// Capturamos a url e dividimos
$url=strip_tags($_SERVER['REQUEST_URI']);
$url_array = explode("/", $url);

// Excluimos o primeiro elemento, que sempre será vazio
array_shift($url_array);

// Coloque aqui o seu include para o topo:
include("topo.php");

// Tratamos a url
if ($url_array[1] != "") {
 include($url_array[0] . "/" . $url_array[1] . ".php");
}
elseif ($url_array[0] != "") {
 include($url_array[0] . ".php");
}
else {
 include("inicio.php");
}

// Coloque aqui o seu include para o rodape:
include("rodape.php");

exit();

?>


3) Para desviar o tráfego para "controle.php" você precisa editar seu arquivo ".htaccess" que se encontra na raiz do seu site (onde estão suas páginas). Se não existir este arquivo você pode criar. No início dele adicione as seguintes linhas:

CODE
RewriteEngine on
RewriteRule !\.(gif|jpg|png|css)$ controle.php

Faça o teste. E se precisar voltar ao estado anterior basta excluir as linhas, o tráfego deixará de ser desviado.

4) Fazendo isso deve funcionar beleza. Caso as imagens deixem de aparecer, é porque você precisará adicionar uma barra no início dos links, assim:

De: <img src="imagens/seta.gif">
Para: <img src="/imagens/seta.gif">


Qualquer coisa pode postar novamente! smile.gif
klango
Eu fiz o seguite coloquei o cógigo na página index e mudei no .htaccess de controle para index e dá o seguinte se digito www.e-teologia.com.br/teste/ ele dá isso:
CODE
Bad Request
Your browser sent a request that this server could not understand.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Se digito www.e-teologia.com.br/teste/index.php dá este erro:

CODE
Warning: main(teste/index.php.php): failed to open stream: No such file or directory in /home/eteolo00/public_html/teste/index.php on line 35

Warning: main(teste/index.php.php): failed to open stream: No such file or directory in /home/eteolo00/public_html/teste/index.php on line 35

Warning: main(): Failed opening 'teste/index.php.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/eteolo00/public_html/teste/index.php on line 35


A pasta teste é a pasta que estou usando para fazer os teste coloquei todos os aquios lá.


t+
SuperEly
No diretorio "teste" o redirecionamento do .htaccess está funcionando e desviando para "index.php". Se eu digito:

http://www.e-teologia.com.br/teste/teologia_sistematica

Um dos erros do código é o seguinte:

CODE
Warning: main(teste/teologia_sistematica.php): failed to open stream: No such file or directory in /home/eteolo00/public_html/teste/index.php on line 35


Perceba que com aquela url ele tentou carregar o arquivo correto, qual seja "teste/teologia_sistematica.php", mas não conseguiu. Este arquivo está lá na pasta teste? Porque parece que ele não está sendo encontrado. Já o arquivo de rodape aparentemente veio beleza, e só não carregou as imagens porque não estão lá ou tem que fazer aquele esquema:

De: <img src="imagens/seta.gif">
Para: <img src="/imagens/seta.gif">
klango
A questão é essa eles estão lá, e quando digito só a pasta teste ele não acha nada e deveria achar o index e quando digito a url completa dá este erro.
SuperEly
Humm... Observando o código da sua página, a normal mesmo, detectei um outro problema. Ela está com três cabeçalhos, incluindo metas tag e tudo mais. Acho que a parte do topo, a do centro e a do rodapé estão todas com cabeçalhos. Você pode tirar do restante e deixar apenas no topo, ou isso vai confundir os buscadores.

O outro problema se deve ao fato de você ter colocando tudo dentro do diretório "teste". Pode deixar lá por enquanto mesmo, mas altere a seguinte parte do código:

De:
CODE
// Excluimos o primeiro elemento, que sempre será vazio
array_shift($url_array);

Para:
CODE
// Excluimos os primeiros elementos
array_shift($url_array);
array_shift($url_array);


Assim tiramos o "teste" que está interferindo na localização dos arquivos. Fazendo isso deve funcionar beleza. Agora sim! biggrin.gif
klango
Estou abrindo uma escola de informática online com os melhores professores do brasil é só acessar forum.wmonline.com.br, mensalidades há 30,00.


Valeu SuperEly funcionou direitinho.




t+
SuperEly
QUOTE(klango @ 10 Feb 2006, 15:01 )
Valeu SuperEly funcionou direitinho.

Aee! biggrin.gif

Esse tipo de implantação só funciona depois de alguns testes mesmo. Eu perdi foi tempo para conseguir mudar as urls da Central Jurídica, mas lá foi mais complicado, e eu ainda não sabia fazer, hehe.

Agora só algumas informações adicionais:

1) Quando você tenta acessar a url:
http://www.e-teologia.com.br/teste
Não funciona porque o ".htaccess" só está ativado dentro dessa pasta. Se quando estiver tudo pronto você colocar na raiz do site deve dar certo. Do modo como está funciona assim:
http://www.e-teologia.com.br/teste/

2) Na parte do código onde tratamos a url, perceba que nós colocamos ela em forma de array, e veja como fica:

http://www.e-teologia.com.br/teste/teologia_sistematica
$url_array[0] = "teologia_sistematica"

http://www.e-teologia.com.br/teste/estudos_biblicos/estudos
$url_array[0] = "estudos_biblicos"
$url_array[1] = "estudos"

Então nós apenas conferimos o que existe no array e carregamos a página apropriada. Fazemos isso nessa parte do código:

CODE
// Se o $url_array[1] for diferente de nada
if ($url_array[1] != "") {
   // Usamos tanto o $url_array[0] quanto o $url_array[1]
   include($url_array[0] . "/" . $url_array[1] . ".php");
}

// Se ao contrário disso, apenas o $url_array[0] for diferente de nada
elseif ($url_array[0] != "") {
   // Usamos o $url_array[0] somente
   include($url_array[0] . ".php");
}

// Se não temos nada no array
else {
 // Carregamos a pagina inicial
 include("inicio.php");
}

Ou seja, existe uma mobilidade muito grande para tratar a url digitada. Fora isso é só carregar o topo antes de tudo e o rodapé logo após.

Flw! Boa programação! thumbs_up.gif
Programador
Alguém já reparou que o charges.com.br está usando o nome da charge no endereço?

Agora eles não usam:
charges.uol.com.br/arquivo.php?id=200

Eles usam
charges.uol.com.br/2006/02/06/esporte-dia-desses-numa-casa-no-rio/

E todas estão assim:
Vejam no arquivo
http://charges.uol.com.br/arquivo.php



Com certeza dá resultado
SuperEly
QUOTE(Programador @ 10 Feb 2006, 20:55 )
Alguém já reparou que o charges.com.br está usando o nome da charge no endereço?

Sim, vários sites estão fazendo isso. A Central Jurídica, por exemplo: tongue.gif

http://www.centraljuridica.com/doutrina/11/direito_civil/principios_da_razoabilidade_proporcionalidade.html

E o resultado é muito bom! biggrin.gif
klango
Eu consegui azer funcionar, o problema agora é com o layout na hora de incluir que estou apanhando, mas vou mexendo até conseguir migrar para este modelo.
ACGlobal
Estou adaptando o sistema também.

Parabéns SuperEly! Esse tópico merece destaque wink.gif e já está pendurado!

Falou! biggrin.gif
Red Hot
Quando tiver um tmpo livre vou postar um novo modo de fazer estas modificações com pouco trabalho para sites já construidos.
É o modo que utilizo na galeria de imagens do meu site. Pois não fique editando arquivo por arquivo do coppermine!
Link na assinatura!
userwm
muito bom o tutorial, parabéns!
klango
Red Hot posta ai o tuto então mano, será muito útil blz?



t+
Red Hot
Vou falar só o básico mas depois coloco um tutorial. Pode ser que tenham erros, pois estou sem tempo, mas tentem seguir a lógica do sistema!

Primeiro você cria um arquivo .htaccess e coloca o conteúdo nele de acordo com os links da sua página.
Exemplo:
Para materia.php?id=125 e categoria?cat=teste

CODE

RewriteRule ^materia([0-9]*).html$ materia.php?id=$1 [L]
RewriteRule ^categoria-([a-z]*).html$ categoria.php?cat=$1 [L]


Depois você adiciona em um arquivo que está incluido no topo de todas as páginas!
o conteúdo:

CODE

ob_start();//Armazena o conteúdo da página em um buffer

function replace_for_mod_rewrite(&$s) { //Função para substituir links
$urlin = array(
"'(?<!/)materia.php\?id=([0-9]*)\"'",
"'(?<!/)categoria.php\?cat=([a-z]*)\"'"
);

$urlout = array(
"materia\\1.html\"",
"categoria-\\1.html\""
);

$s = preg_replace($urlin, $urlout, $s);
return $s;
}



Depois você adiciona em um arquivo que está incluido no fim de todas as páginas!
o conteúdo:
CODE

$conteudo = ob_get_contents(); //Armazena o conteúdo do buffer na variavel $conteudo
ob_end_clean(); //Limpa buffer
echo replace_for_mod_rewrite($conteudo); //Muda os links materia.php?id=125 para materia125.html e o mesmo com categoria.php?cat=teste para categoria-teste.html


A utilidade deste sistema é que você não precisa alterar o conteúdo das páginas e se substituir a linha
echo replace_for_mod_rewrite($conteudo);
por
echo "$conteudo";
O site volta aos links convencionais.
Portanto é mais útil para quem já possui um site com muitas páginas no ar!
Iron-Maiden
QUOTE(Red Hot @ 26/02/2006, 21:44) *

Vou falar só o básico mas depois coloco um tutorial. Pode ser que tenham erros, pois estou sem tempo, mas tentem seguir a lógica do sistema!

Primeiro você cria um arquivo .htaccess e coloca o conteúdo nele de acordo com os links da sua página.
Exemplo:
Para materia.php?id=125 e categoria?cat=teste

CODE

RewriteRule ^materia([0-9]*).html$ materia.php?id=$1 [L]
RewriteRule ^categoria-([a-z]*).html$ categoria.php?cat=$1 [L]


Depois você adiciona em um arquivo que está incluido no topo de todas as páginas!
o conteúdo:

CODE

ob_start();//Armazena o conteúdo da página em um buffer

function replace_for_mod_rewrite(&$s) { //Função para substituir links
$urlin = array(
"'(?<!/)materia.php\?id=([0-9]*)\"'",
"'(?<!/)categoria.php\?cat=([a-z]*)\"'"
);

$urlout = array(
"materia\\1.html\"",
"categoria-\\1.html\""
);

$s = preg_replace($urlin, $urlout, $s);
return $s;
}



Depois você adiciona em um arquivo que está incluido no fim de todas as páginas!
o conteúdo:
CODE

$conteudo = ob_get_contents(); //Armazena o conteúdo do buffer na variavel $conteudo
ob_end_clean(); //Limpa buffer
echo replace_for_mod_rewrite($conteudo); //Muda os links materia.php?id=125 para materia125.html e o mesmo com categoria.php?cat=teste para categoria-teste.html


A utilidade deste sistema é que você não precisa alterar o conteúdo das páginas e se substituir a linha
echo replace_for_mod_rewrite($conteudo);
por
echo "$conteudo";
O site volta aos links convencionais.
Portanto é mais útil para quem já possui um site com muitas páginas no ar!



e no caso de ter uma url grande, como ficaria?

site.com/index.php?categoria=21&subcategoria_cat_add=5

obrigado!
leanjo
testei no meu site e deu erro no IIS

o que pode ser?
Bruno Augusto
Nossa é um tópico meio velho mas já que reergueam ele, vou aproveitar a deixa e tentar fazer funcionar esse treco no meu sistema de banners.

Assim, eu tenho um switch megalomaníaco pendurado na index.php que, em cada case, abre um .tpl do Smarty diferente.
Nesse meu caso como que faria? A propósito, vejam o monstro que tá:

CODE
<?php

//------------------
// Template
//------------------

switch( @$_GET['act'] )
{
    case "help":
    $Smarty    ->    assign('MAIN', $MENU['MAIN']);
    $OUTPUT    =    $Smarty->fetch('help.tpl');
    print "$OUTPUT";
    break;

    case "updates":
    $Smarty    ->    assign('MAIN', $MENU['MAIN']);
    $OUTPUT    =    $Smarty->fetch('updates.tpl');
    print "$OUTPUT";
    break;

    case "report":
        switch( @$_GET['section'] )
        {
            case "stats":
                switch( @$_GET['opt'] )
                {
                    case "advertisers":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/advertisers.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "campaigns":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/campaigns.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "zones":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/zones.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "paycheck":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/paycheck.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "history":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/history.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/stats/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            case "export":
                switch( @$_GET['opt'] )
                {
                    case "advertisers":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/export/advertisers.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "zones":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/export/zones.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "paycheck":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/export/paycheck.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "history":
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/export/history.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
                    $OUTPUT    =    $Smarty->fetch('report/export/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            default:
            $Smarty    ->    assign('MAIN', $MENU['REPORT']);
            $OUTPUT    =    $Smarty->fetch('report/idx.tpl');
            print "$OUTPUT";
            break;
        }
    break;
    
    default:
    $Smarty    ->    assign('MAIN', $MENU['REPORT']);
    $OUTPUT    =    $Smarty->fetch('report/idx.tpl');
    print "$OUTPUT";
    break;

    case "paycheck":
        switch( @$_GET['section'] )
        {
            case "comissions":
            $Smarty    ->    assign('MAIN', $MENU['PAYCHECK']);
            $OUTPUT    =    $Smarty->fetch('paycheck/comissions.tpl');
            print "$OUTPUT";
            break;
            
            case "recurring":
            $Smarty    ->    assign('MAIN', $MENU['PAYCHECK']);
            $OUTPUT    =    $Smarty->fetch('paycheck/recurring.tpl');
            print "$OUTPUT";
            break;
            
            case "payments":
            $Smarty    ->    assign('MAIN', $MENU['PAYCHECK']);
            $OUTPUT    =    $Smarty->fetch('paycheck/payments.tpl');
            print "$OUTPUT";
            break;
            
            case "history":
            $Smarty    ->    assign('MAIN', $MENU['PAYCHECK']);
            $OUTPUT    =    $Smarty->fetch('paycheck/history.tpl');
            print "$OUTPUT";
            break;
            
            default:
            $Smarty    ->    assign('MAIN', $MENU['PAYCHECK']);
            $OUTPUT    =    $Smarty->fetch('paycheck/idx.tpl');
            print "$OUTPUT";
            break;
        }
    break;

    case "manager":
        switch( @$_GET['section'] )
        {
            case "advertisers":
                switch( @$_GET['opt'] )
                {
                    case "add":
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/advertisers/add.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/advertisers/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            case "campaigns":
                switch( @$_GET['opt'] )
                {
                    case "add":
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/campaigns/add.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/campaigns/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            case "zones":
                switch( @$_GET['opt'] )
                {
                    case "add":
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/zones/add.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
                    $OUTPUT    =    $Smarty->fetch('manager/zones/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            case "codes":
            $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
            $OUTPUT    =    $Smarty->fetch('manager/codes.tpl');
            print "$OUTPUT";
            break;
            
            default:
            $Smarty    ->    assign('MAIN', $MENU['MANAGER']);
            $OUTPUT    =    $Smarty->fetch('manager/idx.tpl');
            print "$OUTPUT";
            break;
        }
    break;
            
    case "mail":
        switch( @$_GET['section'] )
        {
            case "manager":
            $Smarty    ->    assign('MAIN', $MENU['MAIL']);
            $OUTPUT    =    $Smarty->fetch('mail/manager.tpl');
            print "$OUTPUT";
            break;
            
            case "create":
            $Smarty    ->    assign('MAIN', $MENU['MAIL']);
            $OUTPUT    =    $Smarty->fetch('mail/create.tpl');
            print "$OUTPUT";
            break;

            case "send":
            $Smarty    ->    assign('MAIN', $MENU['MAIL']);
            $OUTPUT    =    $Smarty->fetch('mail/send.tpl');
            print "$OUTPUT";
            break;
            
            case "history":
            $Smarty    ->    assign('MAIN', $MENU['MAIL']);
            $OUTPUT    =    $Smarty->fetch('mail/history.tpl');
            print "$OUTPUT";
            break;            

            default:
            $Smarty    ->    assign('MAIN', $MENU['MAIL']);
            $OUTPUT    =    $Smarty->fetch('mail/idx.tpl');
            print "$OUTPUT";
            break;            
        }
    break;
        
    case "settings":
        switch( @$_GET['section'] )
        {
            case "interface":
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/interface.tpl');
            print "$OUTPUT";
            break;
            
            case "profile":
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/profile.tpl');
            print "$OUTPUT";
            break;
            
            case "database":
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/database.tpl');
            print "$OUTPUT";
            break;
            
            case "delivery":
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/delivery.tpl');
            print "$OUTPUT";
            break;
            
            case "statistics":
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/statistics.tpl');
            print "$OUTPUT";
            break;
            
            default:
            $Smarty    ->    assign('MAIN', $MENU['SETTINGS']);
            $OUTPUT    =    $Smarty->fetch('settings/idx.tpl');
            print "$OUTPUT";
            break;
        }
    break;

    case "tools":
        switch( @$_GET['section'] )
        {
            case "advanced":
                switch( @$_GET['opt'] )
                {
                    case "lookup":
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/advanced/iplookup.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "geotargeting":
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/advanced/geotargeting.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/advanced/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            case "mysql":
                switch( @$_GET['opt'] )
                {
                    case "analyze":
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/mysql/analyze.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "query":
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/mysql/query.tpl');
                    print "$OUTPUT";
                    break;
                    
                    case "backup":
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/mysql/backup.tpl');
                    print "$OUTPUT";
                    break;
                    
                    default:
                    $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
                    $OUTPUT    =    $Smarty->fetch('tools/mysql/idx.tpl');
                    print "$OUTPUT";
                    break;
                }
            break;
            
            default:
            $Smarty    ->    assign('MAIN', $MENU['TOOLS']);
            $OUTPUT    =    $Smarty->fetch('tools/idx.tpl');
            print "$OUTPUT";
            break;
        }
    break;

    default:
    $Smarty    ->    assign('MAIN', $MENU['MAIN']);
    $OUTPUT    =    $Smarty->fetch('idx.tpl');
    print "$OUTPUT";
    break;
}    
    
?>

Sinistro né? Isso tudo me permite "quebrar" a URL em, por exemplo, act=manager&section=advertisers&opt=add, numa página que adiciona anunciantes.

Agradeço a ajuda.

[]'s
leanjo
e isso nao tem pra asp?
aauhahuauhauhauhuhuhauha
Alexandre Amorim
Boa trade galera, gostaria de uma ajuda de como deixar minhas URLS Amigaveis. Vou postar meu query.php.

Minha estrutura é assim. "Na pagiba index.php contem topo.php, menu.php, query.php" agora vou postar meu arquivo query.php e conto com vcs pra deixar minhas URLS mais Amigoaveis..

"query.php"

<?
$var = "estrutura/principal.php";
$pg = "estrutura/$_GET[pg].php";
if(empty($_SERVER["QUERY_STRING"])) {
include($var);
} else {
include("$pg");
}
?>



Minha URLS ficam assim

www.meusite.com.br/?pg=meu_links

Agradeço,
Alexandre Amorim
sk15
Bem esse topico é velho mais vou ressucitar ele por que acredito que é algo ultiu ...
Tipo para ASP puro não existe, mas para o novo ASP.Net sim a possibilidade de fazer URL amigaveis...

Segue um tutorial:
http://angeruzzi.com/2006/03/10/url-amigavel-em-aspnet/

QUOTE(leanjo @ 16/06/2006, 15:55) *

e isso nao tem pra asp?
aauhahuauhauhauhuhuhauha
Agente Linhares
QUOTE(SuperEly @ 09/02/2006, 23:31) *
Este artigo se destina a fornecer o conhecimento necessário para implementação de uma técnica capaz de melhorar o posicionamento de seu site nas ferramentas de buscas por meio do uso de urls amigáveis aos buscadores. O objetivo não é fornecer um script pronto para ser colocado em cada site, mas sim dar uma idéia clara de como isso pode ser feito.

Vejam o exemplo de uma url comum:

www.site.com/materia.php?id=125

Por meio dessa url o webmaster pode identificar facilmente que deve exibir nesta página a matéria de número 125, mas o problema é a dificuldade que os buscadores têm para indexá-la. Digo isso por experiência própria com este fato já notório na comunidade. Uma página que depende de argumentos não é indexada facilmente e, no geral, não alcança posições tão boas quanto poderia nos resultados das buscas.

A solução é migrar deste formato para um otimizado para buscadores. Existem diversos meios de se alcançar o mesmo resultado, mas vou ensinar aqui a técnica que oferece mais controle. Seu site precisa estar em um servidor web Apache (o mais comum) para utilizá-la.

Para não fazer um artigo gigante vou apenas exemplificar o processo de migração em um site fictício de exemplo. Vamos lá!

Sabemos que é preciso passar aquele número, 125, para sabermos qual matéria exibir. Então nós vamos deixar funcional a seguinte url, em substituição àquela:

www.site.com/materia/125/peixes_africanos

Essa url se reveste de duas vantagens: não passa argumentos da forma tão repudiada pelos buscadores e pode trazer o título da página na url. Este segundo elemento é apenas um adicional benéfico, mas não imprescindível. Se uma das palavras da busca for encontrada na url, seu site ganhará muitas posições.

Agora chega de introdução e vamos ao método em sí!

Você vai encontrar no diretório principal do seu site, seja o "public_html" ou "www" (o local onde estão suas páginas) um arquivo chamado ".htaccess". É isso mesmo, ele não tem nome, apenas extensão. Se não existir, crie este arquivo. Nele você deve escrever o seguinte:

CODE
RewriteEngine on
RewriteRule !\.(gif|jpg|png|css)$ controle.php

São apenas duas linhas. Se o arquivo já existir e houver alguma coisa nele, adicione estas linhas logo no início.

A primeira linha habilita o uso do "mod_rewrite" no seu site. A segunda direcionada todo o tráfego (com exceção de arquivos gif, jpg, png e css) para uma determinada página, neste exemplo, "controle.php".

Agora, se você digitar no navegador algo como:

www.site.com
www.site.com/nada
www.site.com/texto/semsentido

Tudo isso vai cair em "controle.php". Esta se tornou sua página mais importante e é ela quem vai tratar e direcionar todo o tráfego dentro do seu site, mas vamos fazer com que tudo isso aconteça apenas nos bastidores. O que faremos é usar a url digitada como se fosse uma string e extrair dela o que for útil. Veremos como escrever em "controle.php" um bom código de tratamento para podermos usar as tão almejadas urls amigáveis!

Nosso site exemplo tem matérias e notícias, e nós vamos utilizar ambos. As urls vão seguir o seguinte padrão:

www.site.com/materia/125/peixes_africanos

www.site.com/noticia/523/oceano_secou

Nós vamos aproveitar dessas urls apenas a seção (materia ou noticia) e a id (125 e 523, no caso). O resto (peixes_africanos e oceano_secou) está lá apenas para ajudar nas buscas e não será de serventia para o processo. Siga o modelo:

CODE
<?php

// Capturamos a url digitada
$url_site = $_SERVER['REQUEST_URI'];

// Convertemos em array quebrando a string nos pontos certos
$urln = explode("?", $_SERVER['REQUEST_URI']);
$urlt = explode("/", $urln[0]);

// Para manter a compatibilidade com as urls antigas, vamos
// verificar existência do arquivo solicitado propriamente dito
if(is_file($urlt[1])){
  include($urlt[1]);
  exit();
}

// Ja vimos que nao e um arquivo existente, entao prosseguimos
// tratando a url digitada em forma de array
$url=strip_tags($_SERVER['REQUEST_URI']);
$url_array = explode("/", $url);

// Excluimos o primeiro elemento, que sempre será vazio
array_shift($url_array);

// Se a array ficou vazia, mandamos ver no index.php
if(empty($url_array) or $url_array[0] == ""){
  include("index.php");
  exit();
}

// Se restou algo nela, vamos carregar o arquivo correto.
// Adaptacoes possivelmente so precisarao ser feitas nesta
// parte do código
else {

  // Materia
  if ($url_array[0] == "materia") {
    // capturamos a id passada na url
    $id = $url_array[1];
    // carregamos o arquivo real
    include("materia.php");
  }
    
  // Noticia
  elseif ($url_array[0] == "noticia") {
    // capturamos a id passada na url
    $id = $url_array[1];
    // carregamos o arquivo real
    include("noticia.php");
  }

  // Se nao for nenhuma das opcoes acima, carregamos a index mesmo
  else {
    include("index.php");
  }

  exit();
}

?>


Tá bom, o código está comentado mas merece alguma explicação. Apenas para ressaltar, se alguém estiver voando na leitura, isso é o que vai em "controle.php".

No início do código nós verificamos se existia o arquivo procurado na url, e neste caso carregamos ele. Isso para manter a compatibilidade com as urls que você já possui indexadas nos buscadores.

Passada esta fase, quebramos a url pelas barras ("/") existente e criamos um array que se parece com o seguinte:

www.site.com/materia/125/peixes_africanos
$url_array[0] = "materia"
$url_array[1] = "125"
$url_array[2] = "peixes_africanos"

Entretanto, só nos interessaram os dois primeiros elementos. Com eles carregamos o arquivo apropriado com base na leitura da url, no exemplo, "materia.php" ou "noticia.php", ambos existentes em nosso site fictício. No que se refere ao argumento, ou seja, a "id" da matéria ou notícia que vamos apresentar, perceba que colocamos esse dado na variável "$id". Bastará fazer a leitura dela onde for necessário.

Agora vamos saber o que muda no arquivo real que chamamos a partir do controle, ou seja "materia.php", "noticia.php" ou qualquer outro:

1) Perceba que você pode utilizar "$_GET['id']" apenas para manter a compatibilidade, porque se for uma requisição pela nova url, nós vamos pegar esse dado da variável chamada "$id". Então você vai verificar se existe algo em "$_GET['id']" e se não houver, fará o mesmo com a variável "$id", pois o argumento estará em um dos dois.

2) A segunda e última mudança diz respeito ao formato dos links para arquivos ou exibição de imagens. Nossas novas urls utilizam algumas barras, e isso indica mudança de diretório. Logo, precisamos voltar sempre à rais com uma "/" antes dos links. Observe os exemplos:

De: <a href="index.php">
Para: <a href="/index.php">

De: <img src="imagens/seta.gif">
Para: <img src="/imagens/seta.gif">


O método em sí está pronto! A intenção deste artigo não é fornecer um script milagroso que possa ser copiado e colado em qualquer site, pois isso seria utopia. O que forneço aqui é o conhecimento necessário para que cada faça a implementação da melhor forma.

Para conseguir esta última parte da url, por exemplo, basta fazer um tratamento da string trocando espaços por "_" e substituindo também a acentuação e os caracteres especiais.

www.site.com/noticia/523/oceano_secou

Use a criatividade. Você pode também criar urls assim:

www.site.com/noticia/523/oceano_secou.html

www.site.com/noticia/523/oceano_secou/oceano_secou.html

Isso porque as ferramentas de busca atribuem um peso diferente para as palavras encontradas na url em diretórios ou arquivos, e essa parte da url não será útil para o script mesmo.

Você deve trocar todos os links do seu site pelo novo formato para que surta efeito, e se quiser manter algum diretório sem o controle de url basta desativar o mod_rewrite criando nele um arquivo ".htaccess" com o seguinte conteúdo:

CODE
RewriteEngine off


Em caso de dúvidas ou dicas de melhorias sintam-se livres para postar neste tópico, o qual será aperfeiçoado ao longo do tempo com o surgimento de vantagens a serem acrescentadas no texto.

Flw!



Muito bom o tópico.

Breve vou ver se consigo bolar algo pro meu site em ASP baseando nesta lógica.

Mas tenho uma dúvida: - Qual seria melhor pra utilizar como "separador" em termos de indexação? underline ou traço?
sk15
QUOTE(Agente Linhares @ 14/03/2007, 10:11) *
.......
Mas tenho uma dúvida: - Qual seria melhor pra utilizar como "separador" em termos de indexação? underline ou traço?


Da um ligo nesse tópico wink.gif
http://forum.wmonline.com.br/index.php?showtopic=148058
flycker
Seguindo na mesma linha só que uma parte diferente.

Eu vou utilizar um campo digitado pelos os usuários (título) para fazer a url amigavel...
Alguém tem ou sabe onde tem um script PHP bom para filtrar esse campo?
Retirar espaços e converter em outros caracteres, retirar caracteres especiais... etc.

Valeu!
E esse tópico foi muito útil mesmo! smile.gif
laugh.gif
sTriKe
Bom, acabei de descobrir que o modrewrite usa MUITO uso de CPU e ram, provavelmente isso seja a causa de varios hosts aparentemente bons nao terem aguentado meu site(hostdime, hostnet, dreamhost).


Alguém sabe alguma forma de amenizar isso ou substituir por outra coisa que diminua menos a performance?
dilneiss
gente desculpe o ressu.. foi que vi esse post aqui e preferi ressu ele a criar outro topico wink.gif
eu tenho uma área de tutoriais.. e estou usando na seguinte forma os links..
/article/como-melhorar-a-taxa-de-upload-de-sua-conex%E3o-banda-larga-38-1.html

onde /article/ significa que é tutorial e vai usar o arquivo articles.php
como-melhorar-a-taxa-de-upload-de-sua-conex%E3o-banda-larga é nome do tutorial
38 é a id do tutorial
e 1 é a página do tutorial..

como poderei criar o modrewrite para ele interpretar isso?

no caso, esse link deve redirecionar corretamente para:
articles.php?art_id=38&start=1

se deu pra entender o nome do tutorial já está ok.. mas quero que o modrewrite ignore-o e só interprete: article que irá redirecionar para articles.php
o segundo no caso a id do tutorial que redirecionará para art_id=$id
e o terceiro a página no caso colocando no mesmo link: &start=$pagina

alguém pode me dar uma mão nisso? tentei aqui, já li o tutorial todo mas não consegui fazer =/


[edit]
Consegui aqui.. fui tentando de várias maneiras e consegui exatamente oq eu queria original.gif
muito obrigado a quem ao menos pensou em me ajudar smile.gif
Apophis
Gente, li todo o tópico, mas ainda estou com dúvidas...

Supondo que o site não utilize um "id" tipo site.com.br?id=talcoisa mas seja simplesmente assim site.com.br?talcoisa
como fica o código pra que em vez de ?talcoisa o endereço se torne site.com.br/talcoisa ??

Será que eu fui claro? A idéia é tipo substituir o ? pela barra, pois no caso minhas queries strings não tem um código como ?id=secao mas sim ?secao (diretamente) e eu queria migrar pras urls amigáveis.

Obrigado a quem puder me ajudar!
matrix
QUOTE(Apophis @ 04/01/2009, 23:05) *
Gente, li todo o tópico, mas ainda estou com dúvidas...

Supondo que o site não utilize um "id" tipo site.com.br?id=talcoisa mas seja simplesmente assim site.com.br?talcoisa
como fica o código pra que em vez de ?talcoisa o endereço se torne site.com.br/talcoisa ??

Será que eu fui claro? A idéia é tipo substituir o ? pela barra, pois no caso minhas queries strings não tem um código como ?id=secao mas sim ?secao (diretamente) e eu queria migrar pras urls amigáveis.

Obrigado a quem puder me ajudar!



Tenta assim:
CODE
RewriteEngine on
RewriteRule ^diretoriofixo/([_A-Za-z0-9-]+).html/?$ index.php?$1


O $1 vai jogar o valor da variável digitada após o diretoriofixo, por exemplo: www.site.com/diretoriofixo/talcoisa.html
ele vai puxar de index.php?talcoisa

vê se funciona..

ps: o diretoriofixo pode ser retirado
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2009 Invision Power Services, Inc.