URL Rewriting: no IIS com ASP, ASP.NET ou PHP -
PorDarley Passarin em	16/02/2007
Olá Pessoal. Mais uma vez a técnica URL Rewriting vem à tona, não apenas para reforçar que esta técnica traz ótimos benefícios e competitividade a suas URLs, mas sim para aumentar o seu leque de aplicação, focando sua instalação em outros servidores web.
No artigo anterior foi bem focado o seu conceito, utilidade e sua aplicação voltada ao servidor web Apache, com a utilização do módulo Mod_rewrite. Mas existe a necessidade de expandir esta técnica em outros servidores, possibilitando assim a sua aplicação em outras linguagens.
Nativamente o servidor Apache não roda as linguagens Microsoft ASP e ASP.NET, inviabilizando a utilização do URL Rewriting para tais tecnologias. Desta forma, foi necessário buscar métodos ou tecnologias para suprir esta necessidade, tendo em vista, que o alvo desse estudo seria o servidor Microsoft IIS (Internet Information Services), por ser o servidor web recomendado para tais linguagens.
Com base na necessidade, foi executada uma busca por aplicações que executassem a tarefa de re-escrita de URLs de forma satisfatória, chegando ao conhecimento das seguintes tecnologias: IIS Rewrite da QwerkSoft (software pago); ISAPI Rewrite da Helicon Tech (software pago); URL Replacer da Motobit.com (software livre); IIRF – Ionic's ISAPI Rewrite Filter (software livre e com código fonte aberto); e dentre outros não citados.
Dentre este leque de tecnologias, foram adotadas algumas exigências para a seleção do melhor software para a exemplificação neste artigo, dentre elas estão: Utilizar Expressão Regular para filtrar as páginas e parâmetros, se possível semelhante ao do Mod_rewrite; Ser de fácil instalação e configuração; Possuir licença de utilização livre, ou seja, não precisar pagar para utilizar; Tenha uma equipe para corrigir bugs e lançar novas versões, tornando compatíveis com novas versões do IIS; E que funcione corretamente.
Foi escolhido o IIRF dentre todos os outros softwares, por cumprir com todas as exigências impostas.
Antes de iniciar a falar sobre esta tecnologia, só para titulo de conhecimento, é importante frisar que todos os softwares mencionados, são filtros ISAPI's. Através do ISAPI (Internet Server Application Programming Interface) é possível criar softwares escritos em C++, para filtrar as chamadas de páginas e prover funcionalidades adicionais ao IIS.
Instalando o IIRF
Para iniciar, clique aqui e navegue no site do IIRF para baixar a versão atual (source and binary for v1.2.10) do software, para que seja iniciado o tutorial de instalação.
Após baixar o arquivo "IonicIsapiRewriter-1.2.10.zip", descompacte-o em qualquer diretório do seu computador. Neste arquivo estão disponíveis todos os códigos fontes do IIRF, que poderá ser alterado e compilado livremente por você (lembrando que você deve saber o que está fazendo) através dos programas Microsoft Visual Studio 2005 ou Microsoft VC++ 2005 Express.
Existem apenas dois arquivos que serão utilizados realmente, que é a DLL (Dynamically Linked Library) do projeto e o arquivo que irá armazenar as instruções de re-escrita. Os dois se chamam "IsapiRewrite4.dll" e "IsapiRewrite4.ini". Outro arquivo importante que poderá ser complemento a este tutorial, é o "Readme-1.2.txt" que possui todas as informações necessárias para a instalação e configuração do IIRF.
Antes de registramos a DLL no IIS será necessário copiar os dois arquivos para um diretório que o usuário padrão (IUSR_hostname) do IIS tenha permissão de acesso (se não tiver, será necessário dar permissão). É recomendado que seja copiado para o diretório de instalação do ISS, que normalmente é o "c:\windows\system32\inetsrv". Mas no caso de haver mais de um website configurado no servidor, é importante saber que para cada website (lembrando que diretório virtual não é website) é necessário registrar a DLL no ISAPI e que estas devem estar em diretórios separados para possibilitar a criação de instruções separadas por website. Desta forma, neste tutorial estes arquivos serão colocados em um diretório dentro do website principal (mas fique livre para colocar em qualquer lugar).
Dentro da pasta do website principal, que neste caso é o "C:\Inetpub\wwwroot\" crie o seguinte diretório "BinUrlRewriting" e copie os arquivos "IsapiRewrite4.dll" e "IsapiRewrite4.ini" para dentro do mesmo.
Feito isso, agora será necessário registrar esta DLL no ISAPI do IIS. Abra o IIS através do "Painel de Controle", "Ferramentas administrativas" e "Internet Information Services". Clique em "Propriedades" do "Site da Web padrão".
Clique sobre a aba "Filtros ISAPI", que irá mostrar todos os filtros instalados, mas que neste momento não existe nenhum. Clique no botão "Adicionar" para inserir o filtro IIRF no website padrão.
Neste momento, o filtro IIRF foi inserido, mas para que ele possa entrar em funcionamento será necessário reiniciar o IIS. Para isso clique em "Parar item" e depois em "Iniciar item". Após este procedimento abra propriedades novamente, selecione a aba filtros ISAPI e verá no status uma seta verde, que simboliza o funcionamento do filtro.
Agora o IIS está pronto para colocar em prática o URL Rewriting, em que as instruções de re-escrita irão ficar dentro do arquivo "IsapiRewrite4.ini", que obrigatoriamente deve estar localizada no mesmo diretório onde a DLL foi instalada.
Foi mostrado até o momento como instalar o filtro IIRF no IIS. Agora será necessário criar as instruções de re-escrita conforme suas necessidades. Neste caso será mostrado um exemplo de como aplicar esta técnica nas linguagens ASP, ASP.NET e PHP.
Será utilizado as seguintes URLs para a criação das instruções, em que para cada URL será informado um parâmetro especifico (ex-aspx, ex-asp e ex-php) que irá identificar qual a página e linguagem que será executada.
http://localhost/ex-aspx/noticia/1234/testando-url-rewriting-no-iis.html|
http://localhost/ex-asp/noticia/1234/testando-url-rewriting-no-iis.html|
http://localhost/ex-php/noticia/1234/testando-url-rewriting-no-iis.html|
Abra o arquivo "IsapiRewrite4.ini", remova todas as linhas que estiverem dentro e em seguida copie e cole as seguintes instruções.
RewriteRule ^/ex-aspx/noticia/([0-9]+)(/[a-zA-Z0-9_-]+)?(.html)?$ /noticia.aspx?id=$1|
RewriteRule ^/ex-php/noticia/([0-9]+)(/[a-zA-Z0-9_-]+)?(.html)?$ /noticia.php?id=$1|
RewriteRule ^/ex-asp/noticia/([0-9]+)(/[a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?id=$1|
Veja que a sintaxe é idêntica a utilizada no Mod_rewrite no artigo passado. O código "RewriteRule" inicia uma linha de instrução, posteriormente vem a expressão regular que filtra a chamada da página e por último vem a URL original que será executada, juntamente com seus parâmetros.
Como dito no artigo anterior, é necessário ter experiência em expressões regulares, para poder identificar e filtrar as informações corretas. Neste exemplo, as expressões "^…$ " indicam o inicio e fim da instrução. O trecho "/ex-aspx/noticia/" identifica a página e o seu tipo (por linguagem), respectivamente. O trecho "([0-9]+)" filtra um valor inteiro, que por estar entre "()" é identificado como um parâmetro ($1), que será utilizado na chamada da página original. Por fim, o trecho "(/[a-zA-Z0-9_-]+)?(.html)?" é opcional, podendo ser utilizado ou não, devido a expressão "?". Neste momento é importante colocar palavras chaves que destacam o texto, para facilitar a identificação e uma posterior recuperação das informações por mecanismos de busca.
Existem duas coisas que foram detectadas que diferem do Mod_rewrite do Apache, que são: não é necessário ter a linha que inicia (RewriteEngine on) o módulo de re-escrita, porque o arquivo .ini possui unicamente a finalidade de re-escrita; E a outra diferença é que é necessário informar na expressão regular e na URL original o diretório virtual, que neste caso é simbolizado pela "/" no início, que representa o root do website. Isso ocorre basicamente porque o arquivo de configuração é utilizado por todo o website onde o ISAPI foi configurado, incluindo diretórios virtuais, diferente do Mod_rewrite que para cada diretório do website você pode definir instruções diferentes.
Foram criados alguns arquivos exemplos, simbolizando cada linguagem diferente, que pode ser baixado, juntamente com a DLL e INI.
Cada arquivo pega as informações passadas por Query String (id) pela URL original e exibe na tela. Veja o resultado da execução destas páginas.
Execução da página em ASP.NET (utilizando parâmetro ex-aspx):
Execução da página em ASP 3 (utilizando parâmetro ex-asp):
Execução da página em PHP (utilizando parâmetro ex-php):
Viu a simplicidade em utilizar, através do IIRF, várias páginas codificadas em linguagens diferentes ao mesmo tempo, tornando transparente para o usuário do site, qual tecnologia ou estrutura de arquivos estão sendo utilizados. Essa é uma das características boas da técnica URL Rewriting, que foram mais bem explicadas no artigo anterior.
O foco deste artigo foi mostrar que também é possível executar a técnica de URL Rewriting no servidor web IIS, possibilitando a utilização de outras linguagens como ASP e ASP.NET. Viabilizando assim, que sua aplicação web também desfrute das vantagens do URL Rewriting, que é a possibilidade de criar URLs mais seguras, apresentáveis, acessíveis e conseqüentemente mais competitivas.
Obrigado pela leitura e em caso de dúvidas, estarei disponível para ajudá-lo (a) na medida do possível. E aguarde novos artigos.
http://www.imasters.com.br/artigo/5382/webstandards/url_rewriting_criando_urls_competitivas/
Raphael Augusto Ferroni Cardoso disse:
16 de fevereiro de 2007 às 17:17
Na minha opnião essa materia é de grande utilizade para qualquer desenvolvedor. Porque com acensão dos Padrões Web, esse é mais um passo para a perfeição. Só existe um grande problema. Se o servidor não tiver o componente, não poderá ser usado. Mesmo assim parabens pela grande dica. Abraço
16 de fevereiro de 2007 às 19:17
Ontem qdo vi a materia falando do apache fui atras de fazer a mesma coisa no IIS achei varios artigos em ingles agora com esse em pt fica mais facil… vou aplicar a tecnica no portal que desenvolvi. bem como nosso amigo raphael falou se o usuário tiver um host pago q naum tenha esse componente vai ficar na mao… mas essa naum é a questão a questão é didatica! parabens!
17 de fevereiro de 2007 às 12:53
Parabéns pelo artigo. A tempos estava a procura de uma solução neste nível para o IIS, já que é o servidor base de aplicações no meu trabalho. Como a maioria dos frameworks MVC, em PHP e outras linguagens,c omo Ruby on Rails, utilizam a reescrita de URL, fica difícil utilizar com o IIS. Até o momento só conhecia a solução paga, mas essa com certeza me animou para dar continuidade aos meus projetos. Grande matéria, grande dica. Parabéns.
João Luiz Savioli disse:
Ótimo o artigo. Parabéns e obrigado.
Eu fiz tudo, mas me deparei com um problema.
Como ele cria "sub-pastas", ou melhor, simula estar acessando sub-pastas, as imagens e links ficam quebrados. Alguém sabe uma solução simples para isso ou tenho que desenvolver o site pensando em trabalhar com o url rewrite?
Darley Passarin disse:
2 de maio de 2007 às 16:39
Olá João Luiz Savioli, fico feliz de ter gostado do artigo. Para solucionar este problema, basta colocar uma barra no inicio do endereço da imagem ou link. Exemplo, /pasta_de_imagens/imagem.gif ou /index.html. Qualquer dúvida entre em contato. Abraços.
elbrinner da silva disse:
3 de agosto de 2007 às 22:09
Estou testando e estou com problema, o sistema só volta o nome da querystring e o resto continua tudo igual. Só preciso adicionar aquela linha no arquivo IsapiRewrite4.ini ? obrigado
2 de junho de 2008 às 10:25
Houve algum problema, porque quando faço download, o arquivo vem corrompido!
Ednei Oliveira disse:
Caro Darley, eu implementei um esquema de url amigável sem usar componente nenhum. A minha dúvida tem relação com o assunto URL amigável e não especificamente com o conteúdo do seu Tutorial.
Minha dúvida é esta.
Eu tenho o seguinte caso: Tenho uma página chamada conteudo.aspx que recebe um parametro. Ex.: conteudo.aspx?cod=1.
Cada codigo que vem por parametro chama um conteudo que eu desejo exibir.
A forma que achei de aplicar url amigável foi escrever dentro do método Application_BeginRequest que existe dentro do Global.asax. Lá eu posso criar as regras que irão direcionar meu site. Porém eu não quero criar as regras manualmente. Quero cria-las dinamicamente, ou seja, quando o usuário acessar a url http://www.meusite.com/Datacenter ele sera redirecionado para /conteudo.aspx?cod=55 ou tit=Datacenter.
Devo escrever aqui, dentro do Global.asax uma rotina que pegue a URL, pegue o Datacenter, faça um select no banco para achar o respectivo conteudo e ai usar o redirect?
Como você faz a criação das regras dinamicas quando usa URL amigável? Att, Ednei
Dê uma olhada no artigo do Ramon Durães, que mostra como utilizar essa técnica sem a necessidade de instação de um compomente no servidor.
http://imasters.uol.com.br/artigo/5682/aspnet/criando_urls_pra_web_20/
Marcio Cleber Barboza disse:
Pessoal, não sei se aconteceu com vocês, mas segui o tutorial e foi beleza, porém não estou conseguindo usar o Update Panel do Ajax. Alguém tem uma solução?
David Coca disse:
13 de janeiro de 2010 às 0:05
Caro Darley, estou tentando implementar Urls amigáveis mas não estou tendo sucesso!
Asp Clássico 3.0
Seguindo o conceito encontrado no IsapiReWrite4.ini fornecido em seu tutorial
Temos a seguinte regrar para .asp
RewriteRule ^/ex-asp/noticia/([0-9]+)(/[a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?id=$1
Criei a seguinte estrutura
RewriteRule ^/teste/([0-9]+)(/[a-zA-Z0-9_-]+)?(.html)?$ /artigos/teste.asp?a=$1&b=$2&c=$3
Como você pode ver estou trabalhando com três parãmetros (o intuito é utilizar vários)
Ao acessar (http://www.dominio.com.br/teste/123/marca/modelo.html) o sistema me retorna a seguinte mensagem.
Por outro lado se eu acessar apenas com dois parâmetros.
(http://www.dominio.com.br/teste/123/modelo.html) e manda printar as variáveis a, b o resultado é interpretado com sucesso!
Só mais um problema, se eu passar alguma string ex(http://www.dominio.com.br/teste/descricao/marcamodelo.html) no primeiro parâmetro o sistema me retorna o seguinte erro: The system cannot find the path specified.
Seu artigo é muito bom, mas procuro uma resposta que nem na documentação da Locaweb existe, e nem o pessoal da área técnica sabe me responder. Uso o PHP em uma hospedagem híbrida com IIS e ISAPI Rewrite. Os caras so me falam que eu tenho que colocar o .htaccess ou httpd.ini (um dos dois) na pasta \WEB para funcionar. Mas o grande problema e o seguinte, eu tenho vários subdominios com DNS proprios na pasta \WEB e quero usar em apenas um subdominio.
\WEB\site1 –> seu acesso é http://www.site1.com.br
\WEB\site2 –> seu acesso é http://www.site2.com.br
Se eu quero usar uma regra ou url amigável somente para o site1 como eu devo fazer????????
O povo da Locaweb tem uma ma vontade enorme e não respondem e eu ja cansei de fazer teste sem resultado.