Usando mapas de reescrita no Módulo de Reescrita de URL
por Ruslan Yakushev
Este passo a passo apresentará o conceito de mapas de reescrever no módulo de reescrita de URL e orientará você sobre como criar regras de reescrita que usam mapas de reescrita. Neste passo a passo, você criará dois mapas de reescrita: um mapa de reescrita será usado pela regra que executa a reescrita de URL e outro mapa de reescrita será usado pela regra que executa redirecionamentos para um domínio diferente.
Tela de fundo
Um mapa de reescrita é uma coleção arbitrária de pares nome e valor que podem ser usados dentro das regras de reescrita para gerar a URL de substituição durante a reescrita. Os mapas de reescrita são particularmente úteis quando você tem um grande conjunto de regras de reescrita, todas elas usando cadeias de caracteres estáticas (ou seja, quando padrões correspondentes não são usados). Nesses casos, em vez de definir um grande conjunto de regras de reescrita simples, você pode colocar todos os mapeamentos entre o mapa de reescrita – como chaves e valores – usando a URL de entrada e a URL de substituição. Em seguida, para pesquisar a URL de substituição com base na URL de entrada, você terá uma regra de reescrita que faz referência ao mapa de reescrita.
Pré-requisitos
Esse passo a passo requer os seguintes pré-requisitos:
- IIS 7.0 ou superior com serviço de função do ASP.NET habilitado
- Regravação de URL da versão Go Live instalada
Configurando uma página da Web de teste
Para demonstrar a funcionalidade de mapa de reescrita, usaremos uma página asp.net de teste simples. Esta página lê as variáveis do servidor da Web e gera seus valores no navegador.
Copie o seguinte código ASP.NET e coloque-o na pasta %SystemDrive%\inetpub\wwwroot\
em um arquivo chamado article.aspx:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
<h1>URL Rewrite Module Test Page</h1>
<table>
<tr>
<th>Server Variable</th>
<th>Value</th>
</tr>
<tr>
<td>Original URL: </td>
<td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
</tr>
<tr>
<td>Final URL: </td>
<td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
</tr>
</table>
</body>
</html>
Depois de copiar esse arquivo, navegue até http://localhost/article.aspx
e verifique se a página foi renderizada corretamente em um navegador.
Criando um mapa para reescrita
Primeiro, criaremos um mapa de reescrita e uma regra de reescrita que serão usados para executar a reescrita da URL com base em um conjunto de mapeamentos estáticos entre URLs originais e URLs reescritas. Para criar um mapa de reescrita, siga estas etapas:
Vá para o Gerenciador do IIS
Selecione "Site Padrão"
No Modo de Exibição de Recurso, clique em "Reescrita de URL".
No painel "Ações", no lado direito, clique em "Exibir mapas de reescrita...".
No painel "Ações" no site à direita, clique em "Adicionar mapa de reescrita..." e digite o nome do mapa de reescrita como "StaticRewrites":
Na página do mapa de reescrita recém-criado, no painel "Ações" do lado direito, clique em "Adicionar entrada de mapeamento..." e, em seguida, digite "/article" e "/article.aspx?id=1&title=some-title" para as caixas de texto "Valor original:" e "Novo valor:", respectivamente. O valor original especifica de qual caminho de URL queremos reescrever; o novo valor especifica para qual caminho de URL queremos reescrever.
Repita a etapa 6 para adicionar os seguintes mapeamentos ao mapa de reescrita:
Valor original: Novo valor: /some-title /article.aspx?id=1&title=some-title /post/some-title.html /article.aspx?id=1&title=some-title
Agora abra o arquivo web.config de seu site (se você usar o site padrão, o web.config poderá ser encontrado em %SystemDrive%\inetpub\wwwroot
). Você deverá ver a seguinte seção:
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites" defaultValue="">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
</rewriteMaps>
</rewrite>
Esse mapa de reescrita, chamado "StaticRewrites", será usado para reescrever URLs de entrada (definidas como chaves no mapa de reescrita) para suas representações internas (definidas como valores). O atributo defaultValue especifica qual valor usar se uma URL de entrada não tiver sido definida no mapa. Nesse caso, uma cadeia de caracteres vazia será retornada.
Observe que não há um padrão comum óbvio nas chaves e sua relação com os valores. Isso significa que não é possível usar expressões regulares ou curingas para definir a lógica de transformação de URL. Além disso, isso significa que, se não tivéssemos usado mapas de reescrita, teríamos que criar três regras de reescrita. Com mapas de reescrita, podemos criar apenas uma regra de reescrita. A próxima seção explica como criar a regra de reescrita que usa esse mapa de reescrita.
Fazendo referência a um mapa de reescrita a partir da regra de reescrita
Para criar a regra de reescrita que usa os mapas de reescrita, copie e cole o seguinte código XML na seção <rewrite>
do arquivo web.config para seu site:
<rules>
<rule name="Rewrite Rule">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" />
</rule>
</rules>
Vamos analisar cada elemento da regra para entender o que ele faz:
<match url=".*" />
– este elemento diz ao módulo de reescrita de URL para corresponder a qualquer URL de entrada (usando o caractere especial de expressão regular ".")
<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)">
– esta condição verifica se o valor retornado do mapa de reescrita StaticRewrites não é uma cadeia de caracteres vazia. Para executar essa verificação, o valor da variável de servidor REQUEST_URI é passado como um parâmetro para o mapa de reescrita. Se o mapa de reescrita contiver uma entrada com chave, que é a mesma que REQUEST_URI, o valor correspondente a essa chave será retornado. O padrão de expressão regular corresponderá apenas a cadeias de caracteres não vazias, portanto, se a cadeia de caracteres vazia for retornada do mapa, a condição será avaliada como falsa, portanto, nenhuma reescrita será executada. Se a cadeia de caracteres não vazia for retornada, essa cadeia de caracteres será capturada em uma referência de volta devido aos parênteses usados no padrão.
<action type="Rewrite" url="{C:1}" />
– este elemento especifica que o módulo de reescrita de URL precisa reescrever a cadeia de caracteres de URL atual com a nova extraída do mapa de reescrita. Observe que o atributo url faz referência à referência de retorno da condição {C:1}, que foi definida quando o padrão na condição foi correspondido.
Testando a regra para reescrita
Para testar a regra de reescrita que usa o mapa "StaticRewrites", abra o navegador da Web e solicite qualquer uma das seguintes URLs:
http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html
Qualquer uma das URLs acima deve fazer com que a URL seja reescrita de acordo com os mapeamentos definidos no mapa de reescrita. Os resultados deverão ser semelhantes à seguinte página:
Usando mapas de reescrita para redirecionamento
Agora, criaremos outro mapa de reescrita que será usado para definir mapeamentos estáticos entre URLs de origem e URLs de redirecionamento. Para criar um mapa de reescrita, siga as mesmas etapas descritas na seção "Criando um mapa para reescrita", mas nomeie o mapa de reescrita como "StaticRedirects" e use os seguintes valores para mapear entradas:
Valor original: | Novo valor: |
---|---|
/old-article.aspx?id=1 | /article.aspx?id=1 |
/posts/default.aspx?id=1 | /article.aspx?id=1 |
/old-title.html | /article.aspx?id=1 |
O arquivo web.config do seu site agora deve conter estes dois mapas de reescrita:
<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
<rewriteMap name="StaticRedirects">
<add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
<add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
<add key="/old-title.html" value="/article.aspx?id=1" />
</rewriteMap>
</rewriteMaps>
Para criar uma regra que usa o mapa de reescrita StaticRedirects, copie e cole a seguinte definição de regra no arquivo web.config do seu site:
<rules>
<rule name="Redirect Rule" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
</rule>
</rules>
Mais uma vez, vamos analisar cada elemento da regra para entender o que ele faz:
<match url=".*" />
– este elemento diz ao módulo de reescrita de URL para corresponder a qualquer URL de entrada (usando o caractere especial de expressão regular ".")
<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)">
– esta condição verifica se o valor retornado do mapa de reescrita StaticRedirects não é uma cadeia de caracteres vazia. Para executar essa verificação, o valor da variável de servidor REQUEST_URI é passado como um parâmetro para o mapa de reescrita. Se o mapa de reescrita contiver uma entrada com chave, que é a mesma que REQUEST_URI, o valor correspondente a essa chave será retornado. O padrão de expressão regular corresponderá apenas a cadeias de caracteres não vazias, portanto, se a cadeia de caracteres vazia for retornada do mapa, a condição será avaliada como falsa, portanto, nenhuma reescrita será executada. Se a cadeia de caracteres não vazia for retornada, essa cadeia de caracteres será capturada em uma referência de volta devido aos parênteses usados no padrão.
<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
– este elemento especifica que o módulo de reescrita de URL precisa redirecionar o cliente Web para uma nova URL que é construída concatenando o novo nome de domínio (neste caso, é o mesmo domínio para fins de simplicidade) e o caminho da URL de redirecionamento retornado pelo mapa StaticRedirects.
Testando a regra para redirecionamento
Para testar a regra de reescrita que usa o mapa "StaticRedirects", abra o navegador da Web e solicite qualquer uma das seguintes URLs:
http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html
Qualquer uma das URLs acima deve fazer com que o navegador seja redirecionado para o http://localhost/article.aspx?id=1
.
Usando mapas de reescrita para parâmetros de cadeia de caracteres de consulta
O uso de mapas de reescrita não se limita aos exemplos mencionados acima. O mapa de reescrita é uma coleção genérica de pares chave-valor que pode ser usada em qualquer lugar na regra de reescrita. Para ilustrar isso, vamos criar um mapa de reescrita que pode ser usado para manipulação de parâmetros de cadeia de caracteres de consulta.
Crie um terceiro mapa de reescrita, seguindo as mesmas etapas descritas na seção "Criando um mapa para reescrita". Dê ao mapa de reescrita o nome "IDtoTitleMap" e use os seguintes valores para mapear entradas:
Valor original: | Novo valor: |
---|---|
1 | some-title-1 |
2 | some-title-2 |
3 | some-title-3 |
O arquivo web.config do seu site agora deve conter estes dois mapas de reescrita:
<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
<rewriteMap name="StaticRedirects">
<add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
<add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
<add key="/old-title.html" value="/article.aspx?id=1" />
</rewriteMap>
<rewriteMap name="IDtoTitleMap">
<add key="1" value="some-title-1" />
<add key="2" value="some-title-2" />
<add key="3" value="some-title-3" />
</rewriteMap>
</rewriteMaps>
Para criar uma regra que usa o mapa de reescrita IDtoTitleMap, copie e cole a seguinte definição de regra no arquivo web.config do seu site:
<rules>
<rule name="Query String Rule" stopProcessing="true">
<match url="^article\.aspx$" />
<conditions>
<add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False"
redirectType="Permanent" />
</rule>
</rules>
Vamos analisar cada elemento da regra para entender o que ele faz:
<match url="^article\.aspx$" />
– este elemento diz ao módulo de reescrita de URL para executar a regra quando o arquivo article.aspx é solicitado.
<add input="{QUERY\_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
– esta condição verifica se a cadeia de caracteres de consulta contém uma idde parâmetro que tem um valor numérico. O valor real é capturado em uma referência de condição. Observe que esse padrão funcionará mesmo se houver outros parâmetros na cadeia de caracteres de consulta.
<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
– esta condição verifica se o valor retornado do mapa de reescrita IDtoTitleMap não é uma cadeia de caracteres vazia. A condição usa a referência do padrão de condição anterior como uma entrada para o mapa de reescrita.
<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" />
– este elemento especifica que o módulo de reescrita de URL precisa redirecionar o cliente Web de volta para o arquivo article.aspx, mas com o parâmetro de cadeia de caracteres de consulta diferente title, que tem um valor que foi pesquisado no mapa de reescrita.
Testando a regra para a cadeia de caracteres de consulta
Para testar a regra de reescrita que usa o mapa "IDtoTitleMap", abra o navegador da Web e solicite qualquer uma das seguintes URLs:
http://localhost/article.aspx?id=1
. Isso será redirecionado para http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2
. Isso será redirecionado para http://localhost/article.aspx?title=some-title-2
Resumo
Neste passo a passo, você aprendeu a usar mapas de reescrita para definir mapeamentos de URL para regras de reescrita e redirecionamento. Além disso, você aprendeu a usar mapas de reescrita para manipular os parâmetros de cadeia de caracteres de consulta.
Os mapas de reescrita permitem reduzir o número de regras de reescrita quando as URLs de reescrita e redirecionamento são estáticas e a lógica de reescrita não pode ser expressa usando nenhuma técnica de correspondência de padrões.