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
Esse exemplo funciona para páginas asp ?
Funciona sim, é só fazer as alterações necessárias na linha 12.
Abs
Parabéns Rafael, funcionou certinho, me ajudou bastante!!!…
Que bom Vitor. Obrigado pela visita.
Abs
Cara não funciona. porque me ajude
Daniel, se a versão for mais antiga dá problemas mesmo
Abs
E ae, blz? funcionou de boa aqui, me salvou de uma agora heheheheh
Cara, como faço pra esconder a extensão em php usando isso?
valeu
Olá Lucca,
É extamente o que fiz no post.
O usuario digitará http://www.exemplo.com/noticias e o servidor interpretará por “baixo dos panos” como http://www.exemplo.com/index.php?url=noticias
Abs
Há algum tempo estava tendo problema em hospedar os sites que criava em Servidores Windows, com essa solução do web.config funcionou perfeitamente! Obrigado (:
Parabéns, muito bom o post, ajudou 100%.
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
Olá Thiago,
Basta alterar a linha 12 de:
<action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
Para:
<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!
Ótimo post, realmente útil. No entanto gostaria de fazer uma pergunta.
Como posso adicionar a extensão .html ao final da URL?
Por exemplo:
http://exemplo.com/index.php?url=contato
http://exemplo.com/contato.html
Obrigado!
Olá Junior,
No arquivo web.config altere a linha 11 para:
Abs!
Muito obrigado, mas essa foi falta de atenção. Eu deveria ter pensado nessa possibilidade.
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]
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.
e mto bom o que voce fez,
obrigado
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!
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?
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?
ola, estou com um problema, voce sabe como posso fazer para chamar um arquivo que se encontra dentro de uma pasta?
/usuarios/index.php
assim como eu tenho mas nao consigo
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…
como uso o RewriteBase no web.config?
Cara… já ando desesperado com links amigáveis em servidor windows.
Por exemplo, tenho a página http://www.jmt.pt/textil.html
Qual é o código para que o link funcione sem o “.html” no final?
Obrigado pela atenção.
Abraço,
Jorge.
funcionou perfeitamente!
Vlw, funcionou de boa.
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.
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 \õ
Bom dia.
Senhores estou tentando fazer uma modificação que no apache é possivel,
mas não tenho ideia de como faze-lo no iis
Preciso deixar um link:
http://localhost/projeto/geral/noticias.php
transformar-se em
http://localhost/projeto/index.php
é possivel no iis??
Quero modificar a url para que todas as chamadas independente da pagina que rode por traz
mostre a pagina index.php como padrao em todo o sistema.
É possivel?
Excelente post!
Valeu!