«

»

Aug 28

Print this Post

Como posso obter URLs amigáveis ao usuário e search engines?

Devido à natureza dos websites em ColdFusion, voce pode achar algumas de suas páginas com uma string longa de parâmetros URL que tornam a página menos intuitiva e amigável (user friendly). Junto a olhar pelos seus visitantes humanos, voce tambem pode querer optimizar seus URLs dinâmicos para um tratamento mais favorável às search engines. Enquanto este site não é o lugar para se debater técnicas de SEO (search engines optimization), estamos trabalhando sob o pressuposto de que os search engines parecem preferir URLs mais legíveis (human readable) do que URLs de strings dinâmicas.

Vejamos alguns exemplos de URLs:
http://www.coldfusioncookbook.com/index.cfm?event=faq
ficaria melhor como:
http://www.coldfusioncookbook.com/faq
e
http://www.coldfusioncookbook.com/index.cfm?event=showentry&id=1
ficaria melhor como:
http://www.coldfusioncookbook.com/entry/1/How-do-I-mail-the-contents-of-a-form?

Então, como voce poderia tornar seus URLS mais legíveis?
a) Escreva algum código customizado usando a variável cgi.path_info variable, ou
b) Deixe seu servidor de web fazer o trabalho para voce.

1) Usando o cgi.path_info e um pouco de código customizado, voce pode fazer o ColdFusion analisar seus URLs mais complexos em favor de algo mais simples.

São realmente duas partes. Primeiro temos que reconhecer a forma “estranha” do URL – e uma fez feito isso – nós o transformamos (parse).

Para começar – sempre que o URL vier na forma http://host/filename.cfm/stuff/at/the/end, seu servidor de web reconhecerá que “filename.cfm” é o que voce quer. Ele então pegará o restante e guardará numa variável CGI, path_info. Algumas vezes, esta variável CGI tambem conterá o nome do arquivo. Para nossa sorte, Michael Dinowitz escreveu um bom artigo mostrando-nos exemplos de regex (regular expressions) para “limpar” esse valor. Não consigo achar um link direto para esse artigo, mas ele está no website da House of Fusion. (procure pelo artigo “Search Engine Safe (SES) URLs). Nesse artigo ele tem uma UDF completa para lidar com valores, mas eu vou focar somente nos regex. Este exemplo abaixo os mostra em ação:

<cfset pathInfo = reReplaceNoCase(trim(cgi.path_info), ".+\.cfm/? *", "")>
<cfoutput>
cgi.path_info=#cgi.path_info#<br>
stripped: #pathInfo#
</cfoutput>

Voce não precisa se preocupar muito com o regex, ele basicamente apenas cuida de remover qualquer nome de arquivo em potencial da variável CGI. Não estou vendo nenhum nome de arquivo nos meus servidores Apache ou IIS, mas eu sei que já vi no passado.

Neste ponto nós temos uma variável pathInfo que guardará alguma informação que foi adicionada ao final do nosso filename. Como nós analisaremos isso? Obviamente voce tem uma lista ColdFusion usando o caracter  / como delimitador. No meu exemplo acima, “http://host/filename/stuff/at/the/end”, miniha variável pathInfo teria: “/stuff/at/the/end”. Como eu analiso isso, está a cargo da aplicação. No BlogCFC, eu verifico o tamanho do valor (usando listLen e / como delimitador) para certificar que o tamanho é 4. Os primeiro 3 valores se referem à data e o último ítem se refere ao alias.

Voce deve usar um formato que é típico de variáveis URL. Alguma coisa como: http://host/filename.cfm/product/323. Neste formato, o URL é simplesmente outra forma de se dizer: http://host/filename.cfm?product=323. Para analisar este formato, eu teria que iterar sôbre a lista e criar variáveis URL. Aqui está um exemplo de como fazer isso:

function parseSES() {
     var pathInfo = reReplaceNoCase(trim(cgi.path_info), '.+\.cfm/? *', '');
     var i = 1;
     var lastKey = "";
     var value = "";
     if(not len(pathInfo)) return;
     for(i=1; i lte listLen(pathInfo, "/"); i=i+1) {
          value = listGetAt(pathInfo, i, "/");
          if(i mod 2 is 0) url[lastKey] = value;
          else lastKey = value;
     }
     //did we end with a "dangler?" if((i-1) mod 2 is 1) url[lastKey] = "";
     return;
}

Que estamos fazendo aqui? Como mencionei antes, começamos por procurar coisas após a barra (“/”) final. Se não acharmos nada, retornamos da função. (Normalmente uma UDF retorna alguma coisa. Um comando “return” sozinho significa sair da função sem retornar nada.)

Depois tratamos do valor como uma lista e iteramos sôbre ela. Queremos fazer as coisas em pares – em outras palavras – o primeiro item é a variável, o segundo é o valor. Simplesmente verificamos nosso contador da lista, i, e em números ímpares, guardamos o valor como “lastKey” (última chave) e em números pares, escrevemos para o escopo URL. (UDFs nunca devem acessar diretamente variáveis fora do seu próprio escopo. Esceto quando devido!) Este código assume um número par de valores. Logo, o que acontece se a variável pathInfo fôr ímpar? (Ex: /products/5/foo) Tratamos essa como uma variável “vazia” e criamos o valor no escopo URL com uma string vazia. Isto poderia ser utilizado como uma flag. Então por exemplo,  /productid/5/short, poderia significar colocar url.productid como 5, que é o registro do database a ser carregado, e “short” simplesmente significa a versão simplificada do conteúdo.

2) Em relação a ter o seu servidor de web a fazer o trabalho para voce, a solução é configurar o seu servidor de web de tal forma que o URL atual seja interpretado e então exibido como um URL mais legível e amigável.

Appache

Apache tem capacidade mod rewrite. Voce pode configurar as regras de rewrite num arquivo.htaccess. Este arquivo funciona em qualquer pasta que voce colocá-lo. Logo, colocando o código a seguir em um arquivo .htaccess localizado no raiz do seu website, voce consegue obter o mesmo resultado de url rewrites do exemplo acima.

RewriteEngine on
RewriteRule faq /\?event=faq [PT]
RewriteRule entry/([0-9]+)/.* /\?event=showentry&id=$1 [PT]

IIS

IIS não tem funcionalidade rewrite embutida, mas voce pode adicioná-la com o filtro ISAPI grátis da Ionics :
http://cheeso.members.winisp.net/IIRF.aspx

Nota de crédito: Raymond Camden me ajudou a escrever parte deste artigo.

by Jeremy Petersen


 

Permanent link to this article: http://ensina.me/coldfusion/como-posso-obter-urls-amigaveis-ao-usuario-e-search-engines/

1 comment

  1. Pessoal

    Achei super legal o tutorial e deu para ter uma ideia do assunto, mas gostaria de saber como efetivamente aplicar esse exemplo em um projeto, talvez um exemplo de uso final nesse artigo aumente ainda mais a qualidade dele.

    Parabéns pela iniciativa.

    Lucas

Leave a Reply