URL amigáveis no IIS

Há algum tempo atrás escrevi um post explicando algumas coisas sobre URL amigáveis e como configurá-las no servidor de aplicações Apache(Confira esse post aqui).

Pois bem. O post de hoje é um pouco semelhante. Na verdade trataremos aqui como configurar o ambiente de sua aplicação php para executar as URL amigáveis no servidor IIS (Internet Information Server). O IIS é um servidor de aplicações criado pela Microsoft para ser instalado, configurado e utilizado em seus sistemas operacionais Windows. Ele é capaz de “rodar” scripts em asp, .NET(C#, VB.NET, ASPX, etc) e também o nosso querido amigo php.

E assim como o apache, o IIS também é capaz de obedecer regras para que uma determinada URL seja tratada antes que o servidor interprete sua requisição. Como dito no outro post, isso facilita a padronização e organização das URLs de um sistema ou site.

No apache definimos as regras de reescrita através do arquivo .htaccess . No IIS o processo é quase idêntico. Ao invés de criarmos o .htacces criaremos um arquivo chamado web.config . Nesse arquivo podemos fazer tudo que fazemos no htaccess, inclusive definir as regras de reescrita de URLs. A diferença é que nele faremos no formato xml.

Veja um exemplo prático do arquivo web.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="exemplo 1" stopProcessing="true">
<conditions>
  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<match url="^(.*)$" ignoreCase="true" />
<action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Utilizo o cabeçalho normal de um arquivo XML. Na linha 6 eu defino o nome da minha rule. Depois coloco minhas condições informando que os diretórios e os arquivos(ex: imagens) não sejam interpretadas na regra de reescrita.

Na linha 11  é definido o parâmetro url com a expressão regular que ela deverá obedecer e o ignoreCase=”true” para que caracteres maiúsculos e minúsculos não interfiram na reescrita. Depois na linha 12 é definida a ação, onde deverá ser substiuído o “index.php?url={R:1}“,  ou seja, o que for colocado depois da barra será atribuído ao parâmetro url. O appendQueryString serve para que possamos utilizar outros parâemtros na URL depois do (?). Ex: site.com/noticias/?id=1. Assim o 1 é atribuído ao id  e não ao url.

Lembrando que você pode definir quantas regras(rules) de reescrita quiser dentro do web.config

Espero ter ajudado

Abs

Siga-me no twitter: @rafaelwendel

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Ola. Ótimo post. Praticamente o que eu estava buscando, exceto que eu preciso que seja duas variáveis. Como ficaria o link com das variáveis? Abraços e parabens novamente pelo post

    1. Olá Thiago,

      Basta alterar a linha 12 de:

      12
      
      <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />

      Para:

      12
      
      <action type="Rewrite" url="index.php?url={R:1}&SUA_VAR={R:2}" appendQueryString="true" />

      Obviamente você vai trocar o “SUA_VAR” pelo nome que desejar.

      Abs!

  2. Desculpe, mas após alguns testes me deparei com outro problema. Agradeço se alguém puder ajudar. Abaixo segue o que utilizo no .htaccess, no entanto não estou conseguindo traduzir para o web.config

    #Mostra Artigo
    RewriteRule ^noticia.html$ index.php?url=noticia [L,QSA]
    RewriteRule ^noticia/([a-zA-Z0-9_-]+)\.html$ index.php?url=noticia&id=$1 [NC,L,R=301]
    RewriteRule ^noticia/([0-9]+)/([a-z0-9-]+)\.html$ index.php?url=noticia&id=$1$titulo=$2 [NC,L]

    #Mostra Categoria
    RewriteRule ^categoria.html$ index.php?url=categoria [L,QSA]
    RewriteRule ^categoria/([a-zA-Z0-9_-]+)\.html$ index.php?url=categoria&id=$1 [NC,L,R=301]
    RewriteRule ^categoria/([0-9]+)/([a-z0-9-]+)\.html$ index.php?url=categoria&id=$1$nome=$2 [NC,L]

  3. Rafael,

    O problema que citei anteriormente, você acredita ser de difícil solução? Fiz uma extensa pesquisa e ainda não consegui solucionar essa migração de .htaccess para web.config.
    Se conseguir me ajudar ou indicar o caminho correto, agradeço.

  4. E ai Rafael tudo bem? Ótimo post! Queria só uma ajudinha sua.

    Gostaria de transformar a url
    http://tvcidades.net/materia.php?c=2&n=jovem-e-preso-roubando-armas-226
    em
    http://tvcidades.net/2/jovem-e-preso-roubando-armas-226

    Tentei fazer algumas modificações, mas o máximo que consegui foi isso

    http://tvcidades.net/materia.php?2/jovem-e-preso-roubando-armas-226

    Ta pertinho do resultado que eu quero, mas agora queria suprimir o materia.php. Como faço isso? Abaixo a linha de código do meu web.config

    Agradeço a atenção!

  5. Olá Ronald, boa tarde
    Tenho um cliente que usa asp clássico (arquivos .asp) e o site dele está hospedado em um Servidor Semi-dedicado Windows 2003 com Rewrite 3.0 e IIS 6.0 qual o arquivo que devo usar? httpd.ini, .htaccess ou web.config
    Tem alguma instrução diferenciada para arquivos .asp?

  6. UMA DÚVIDA…
    NA PÁGINA Q EU ESTOU, CLICO EM QQ HREF ELE DIRECIONA PARA A PÁGINA DESTINO….
    COMO EU LIMITO ISSO A APENAS 1 OU 2 HREFS?

  7. Olá Rafael,

    Muito obrigado por esse Post. Infelizmente eu sou um pouco limitado nos conhecimentos de programação e não consegui resolver meu problema.

    Eu utilizo esse .htaccess

    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?cod=$1
    #www.url.com.br/secao/subsecao/, será interpretada por http://www.url.com.br/index.php?cod=secao/subsecao/

    AddType font/ttf .ttf
    AddType font/eot .eot
    AddType font/otf .otf
    AddType font/woff .woff

    Header set Access-Control-Allow-Origin “*”

    E não estou conseguindo adaptar o web.config

    Você pode me ajudar? Eu uso um arquivo index.php onde defino as urls…

  8. Boa tarde, estou tentado rodar no servidor IIS o arquivo web.config já buscamos em vários locais, porém sem sucesso.

    Tenho uma aplicação em PHP, eu sempre trab com servidor Linux, então eu tenho .htaccess, achei em alguns lugares um gerador, tentei transformar em web.config porém fica dando erro 500.

    Peguei o seu código troquei o index.asp para index,php e mesmo assim ele ainda da erro 500

    Você sabe me dizer se tem qua habilitar algo, fico no aguardo,desde já obrigado.

  9. Cara, meus parabéns! Isso me ajudou bastante, pois todos os meus clientes usam Apache, já estava tão acostumado ao .htaccess que quando peguei um IIS da vida quase larguei as URL’s amigáveis. Valeu \õ

Deixe um comentário

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