Criando regras de saída para o Módulo de Reescrita de URL

por Ruslan Yakushev

Esta seção da documentação se aplica à versão 2.0 do Módulo de Reescrita de URL do IIS 7.

Este passo a passo orientará você sobre como criar e testar uma regra de reescrita de saída para o Módulo de Reescrita de URL 2.0.

Pré-requisitos

Esse passo a passo requer os seguintes pré-requisitos:

  1. IIS 7 ou superior com o serviço de função do ASP.NET habilitado;
  2. Módulo de Reescrita de URL versão 2.0 RC instalado.

Configurando uma página da Web de teste

Para demonstrar como o módulo de reescrita de URL 2 funciona, você usará uma página ASP.NET simples. Essa página lê as variáveis do servidor Web e exibe seus valores no navegador. Ela também constrói um hiperlink usando as variáveis de servidor e, em seguida, coloca esse link no HTML de resposta.

Para criar a página de teste

  1. Crie um arquivo chamado article.aspx na seguinte pasta:

    %SystemDrive%\inetpub\wwwroot\
    
  2. Copie a seguinte marcação ASP.NET, cole-a no arquivo e salve o arquivo:

    <%@ 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 v2 Test</title>
    </head>
    <body>
        <h1>URL Rewrite Module v2 Test Page</h1>
        <h2>Inbound URL Rewriting</h2>
        <table>
            <tr>
                <th>Server Variable</th>
                <th>Value</th>
            </tr>
            <tr>
                <td>Original URL: </td>
                <td><%= Request.ServerVariables["UNENCODED_URL"] %></td>
            </tr>
            <tr>
                <td>Final URL: </td>
                <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
        </table>
        <h2>Outbound URL Rewriting</h2>
            <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article.
    </body>
    </html>
    
  3. Abra um navegador da Web e solicite a seguinte URL para garantir que a página seja renderizada corretamente:

    http://localhost/article.aspx
    

Adicionando uma regra de reescrita de entrada

A próxima etapa é adicionar uma regra que reescreva URLs que tenham o seguinte formato:

http://localhost/article/342/some-article-title

Essas URLs serão reescritas para ter um formato como o seguinte:

http://localhost/article.aspx?id=342&title=some-article-title

Para adicionar a regra de reescrita de entrada:

  1. Abra o arquivo web.config que fica no seguinte local:

    %SystemDrive%\inetpub\wwwroot\
    
  2. No elemento /configuration/system.webServer, adicione o seguinte e salve o arquivo:

    <rewrite>
      <rules>
        <rule name="Rewrite to article.aspx">
          <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
          <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

Para saber mais sobre como criar regras de reescrita de entrada, consulte Criando regras de reescrita para o Módulo de Reescrita de URL.

Testando a regra de reescrita de entrada

Agora você pode testar se a regra de reescrita de entrada está funcionando conforme projetado.

Para testar a regra de reescrita de entrada:

Abra um navegador da Web e solicite a seguinte URL:

http://localhost/article/342/some-article-title

Se a regra de reescrita estiver funcionando corretamente, você obterá uma resposta do servidor semelhante à seguinte:

Screenshot of the Final U R L after hovering over the link in the U R L Rewrite Module Test Page using a web browser.

Você pode ver que, devido à regra de entrada, é possível acessar essa página da Web usando uma estrutura de URL simples e amigável. No entanto, se um usuário clicar no hiperlink dentro da página HTML, a URL com parâmetros de cadeia de caracteres de consulta será usada pelo navegador da Web. Isso não é preferível por vários motivos:

  1. Os visitantes do site verão a estrutura da URL interna que você queria ocultar usando uma regra de reescrita de URL.
  2. A mesma página será acessível por várias URLs, o que não é ideal para otimização do mecanismo de pesquisa.

A maneira mais direta de corrigir isso é modificar a página HTML para usar a estrutura de link simples. No entanto, em muitos casos, isso não é possível. Por exemplo, se você já tiver um aplicativo Web herdado complexo ou um aplicativo Web no qual não possa fazer modificações, a tarefa de corrigir todos os links de URL no aplicativo poderá ser muito demorada ou inviável.

É quando a reescrita da URL de saída pode ajudar. A reescrita da URL de saída pode corrigir os links rapidamente na resposta gerada por um aplicativo.

Criar uma regra de reescrita de saída

Agora, você criará uma regra de reescrita de saída que altera as URLs nas respostas HTML. A regra alterará as URLs que têm o seguinte formato:

http://localhost/article.aspx?id=342&title=some-article-title

Essas URLs serão reescritas da seguinte forma:

http://localhost/article/342/some-article-title

Você criará uma regra de saída usando a interface do usuário Reescrever URL no Gerenciador do IIS.

Para criar a regra de saída:

  1. Abra o Gerenciador do IIS
  2. Selecione "Site Padrão"
  3. No Modo de Exibição de Recurso, selecione "Reescrita de URL"
    Screenshot of U R L Rewrite selected in the Default Web Site Home pane.
  4. No painel Ações, no lado direito, clique em "Adicionar Regras...". Na caixa de diálogo "Adicionar Regras", selecione a "Regra em Branco" na categoria "Regras de saída" e clique em OK.
    Screenshot of selecting a Blank rule template under Outbound rules in the Add Rules dialog.

Agora, você deve definir a regra de saída real. No Módulo de Reescrita de URL 2.0, uma regra de reescrita de saída é definida especificando as seguintes informações:

  • Nome da regra.
  • Uma pré-condição opcional que controla se essa regra deve ser aplicada a uma resposta.
  • O padrão a ser usado para corresponder à cadeia de caracteres na resposta.
  • Um conjunto opcional de condições.
  • A ação a ser executada se um padrão for correspondido e todas as verificações de condição forem bem-sucedidas.

Nomeando a regra

Na caixa de texto "Nome", insira um nome que identificará exclusivamente a regra, por exemplo: "Reescrever para limpar URL".

Definindo uma pré-condição

Uma pré-condição é usada para avaliar se a avaliação de regras de saída deve ser executada em uma resposta. Por exemplo, se for uma regra que modifica o conteúdo HTML, somente as respostas HTTP com o cabeçalho do tipo conteúdo definido como "texto/html" devem ser avaliadas em relação a essa regra. A avaliação de regras de saída e a reescrita de conteúdo são uma operação intensiva de CPU que pode afetar negativamente o desempenho de um aplicativo Web. Portanto, use pré-condições para restringir os casos em que as regras de saída são aplicadas.

Como a regra que você está criando deve ser aplicada somente em respostas HTML, você definirá uma pré-condição que verifica se o tipo de conteúdo do cabeçalho de resposta HTTP é equial para "texto/html".

Para definir uma pré-condição:

  1. Na lista de pré-condições, selecione "<Criar Pré-condição>".

  2. Isso levará você à caixa de diálogo do editor de pré-condição, na qual você precisará definir a pré-condição. Especifique as configurações de pré-condição da seguinte maneira:

    • Nome: "IsHTML"

    • Usando: "Expressões regulares"

    • Clique em "Adicionar" para abrir a caixa de diálogo "Adicionar condição". Nesta caixa de diálogo, especifique:

      • Entrada de condição: "{RESPONSE_CONTENT_TYPE}"

      • Verifique se a cadeia de caracteres de entrada: "Corresponde ao padrão"

      • Padrão: "^texto/html"

        Screenshot of adding a new pre-condition with the specified settings.

  3. Clique em OK para salvar a pré-condição e retornar à página "Editar Regra".

Definindo um escopo correspondente

A regra de reescrita de saída pode operar no conteúdo de um cabeçalho HTTP ou no conteúdo do corpo da resposta. Essa regra precisa substituir links no conteúdo da resposta para que na lista suspensa "Escopo Correspondente" escolha "Resposta".

Definindo um filtro de marca

Os filtros de marca são usados para definir o escopo do padrão correspondente somente a determinados elementos HTML, em vez de avaliar toda a resposta em relação ao padrão da regra. A correspondência de padrões é uma operação com uso muito intensivo de CPU e, se uma resposta inteira for avaliada em relação a um padrão, ela poderá diminuir significativamente o tempo de resposta do aplicativo Web. Os filtros de marca permitem especificar que a correspondência de padrões deve ser aplicada somente dentro do conteúdo de determinadas marcas HTML, reduzindo significativamente a quantidade de dados que precisam ser avaliados em relação ao padrão da expressão regular.

Para definir um filtro de marca, expanda a lista suspensa "Corresponder ao conteúdo dentro de:" e marque a caixa de seleção "Um (atributo href)".

Isso configura a regra para aplicar o padrão somente ao valor do atributo href do hiperlink, como no seguinte exemplo:

<a href="this string will be used for pattern matching">Some link</a>

Definindo um padrão

Na caixa de texto "Padrão", insira a seguinte cadeia de caracteres:

^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_0-9a-z-]+)$

Essa cadeia de caracteres é uma expressão regular que especifica que o padrão corresponderá a qualquer cadeia de caracteres de URL que atenda às seguintes condições:

  • Começa com a sequência de caracteres "/article.aspx?".
  • Contém um primeiro parâmetro de cadeia de caracteres de consulta que tem um valor numérico.
  • Contém um segundo parâmetro de cadeia de caracteres de consulta que tem um valor alfanumérico.

Observe que certas partes da expressão regular estão entre parênteses. Esses parênteses criam grupos de captura, que podem ser referenciados posteriormente na regra usando referências retroativas. Além disso, na maioria dos casos, o símbolo "&" é codificado em HTML na resposta, então o padrão de expressão regular precisa levar isso em consideração.

Definindo uma ação

Escolha o tipo de ação "Reescrever" na caixa de grupo "Ação". Na caixa de texto "Valor", insira a seguinte cadeia de caracteres:

/article/{R:1}/{R:2}

Essa cadeia de caracteres especifica o novo valor para o qual o endereço do link deve ser reescrito. Observe que, para os valores dos parâmetros de cadeia de caracteres de consulta, a expressão usa {R:1} e {R:2}, que são as referências aos grupos de captura que foram definidos no padrão de regra usando parênteses.

Deixe valores padrão para todas as outras configurações. A página de propriedades "Editar Regra" se parecerá com a seguinte página:

Screenshot before applying the new Outbound Rewrite Rule with the Is H T M L Pre-condition

Salve a regra clicando na ação "Aplicar" no lado direito.

Exibindo a regra de reescrita no arquivo de configuração

As regras de reescrita são armazenadas no arquivo aplicationHost.config ou em arquivos web.config. Para verificar a configuração da regra que acabamos de criar, abra um arquivo web.config localizado em

%SystemDrive%\inetput\wwwroot\

Nesse arquivo, você verá a seção <rewrite> que contém todas as definições de regras, como no seguinte exemplo:

<rewrite>
 <rules>
  <rule name="Rewrite to article.aspx">
   <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
   <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
  </rule>
 </rules>
 <outboundRules>
  <rule name="Rewrite to clean URL" preCondition="IsHTML">
   <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&amp;|&amp;amp;)title=([_0-9a-z-]+)$" />
   <action type="Rewrite" value="/article/{R:1}/{R:2}" />
  </rule>
  <preConditions>
   <preCondition name="IsHTML">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
   </preCondition>
  </preConditions>
 </outboundRules>
</rewrite>

Testando a regra

Agora, você pode testar se a regra reescreve corretamente as URLs. Abra um navegador da Web e solicite a seguinte URL:

http://localhost/article/342/some-article-title

Você deve ver que a regra de reescrita de saída alterou o link dentro da resposta HTML:

Screenshot of the new U R L after hovering over the link in the U R L Rewrite Module Test Page using a web browser.

Agora, se um visitante do site clicar neste link, o formato de URL limpo será usado e uma representação da URL interna usada por esta página não será revelada.

Resumo

Neste passo a passo, você aprendeu a configurar regras de reescrita de saída no Módulo de Reescrita de URL 2.0 usando o Gerenciador do IIS ou editando manualmente o arquivo web.config. As regras criadas neste passo a passo demonstraram alguns dos recursos importantes do Módulo de Reescrita de URL 2.0, como a reescrita de saída, as pré-condições e os filtros de marca.