Criando regras de reescrita para o Módulo de Reescrita de URL

por Ruslan Yakushev

O módulo de reescrita de URL é uma extensão do IIS que está disponível como download para o Servidor IIS autônomo e também está pré-instalado em qualquer site nos Sites do Windows Azure (WAWS) e disponível para seu uso. Este passo a passo orientará você sobre como criar e testar um conjunto de regras de reescrita para o Módulo de Reescrita de URL.

Pré-requisitos

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

  1. IIS 7 ou superior com serviço de função do ASP.NET habilitado.
  2. Módulo de Reescrita de URL instalado. Para obter mais informações, confira Usando o Módulo de Reescrita de URL.

Configurando uma página da Web de teste

Para demonstrar como o Módulo de Reescrita de URL funciona, usaremos uma página ASP.NET de teste simples. Esta página lê as variáveis do servidor 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 uma regra de reescrita

Criaremos uma regra de reescrita simples que reescreverá URLs usando o seguinte formato:

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

Criaremos uma regra de reescrita usando a interface do usuário de Reescrita de URL no Gerenciador do IIS. Para fazer isso, siga estas etapas:

  1. Vá até o Gerenciador do IIS.
  2. Selecione Site Padrão.
  3. No Modo de Exibição de Recurso, clique em Reescrita de URL.
    Screenshot that shows the Default Web Site Home pane. U R L Rewrite is selected.
  4. No painel Ações, no lado direito, clique em Adicionar regras...
    Screenshot that shows the U R L Rewrite pane.
  5. Na caixa de diálogo Adicionar Regras, selecione Regra em Branco e clique em OK.
    Screenshot that shows the Add Rules dialog box.

Agora, você precisa definir a regra de reescrita real. No Módulo de Reescrita de URL, uma regra de reescrita é definida especificando quatro informações essenciais:

  • Nome da regra.
  • Padrão a ser usado para corresponder à cadeia de caracteres de URL.
  • Conjunto opcional de condições.
  • Ação a ser executada se um padrão for correspondido e todas as verificações de condição forem bem-sucedidas.

Nomeando uma regra

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

Screenshot that shows the Edit Inbound Rule pane.

Definindo um padrão

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

^article/([0-9]+)/([_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:

  1. Começa com a sequência de caracteres "/article/".
  2. Contém um ou mais caracteres numéricos após o primeiro "/".
  3. Contém um ou mais caracteres alfanuméricos, ou "_" ou "-" após o segundo "/".

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.

Definindo uma ação

Como a regra que estamos criando deve reescrever a URL, escolha o tipo de ação Reescrever listada na caixa de grupo Ação. Na caixa de texto Reescrever URL:, insira a seguinte cadeia de caracteres:

article.aspx?id={R:1}&title={R:2}

Essa cadeia de caracteres especifica o novo valor para o qual a URL de entrada deve ser reescrita. Observe que, para os valores dos parâmetros de cadeia de caracteres de consulta, usamos {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 de Entrada deve se parecer com a seguinte página:

Screenshot that shows the Edit Inbound Rule property page.

Salve a regra clicando em Aplicar no lado direito.

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

As regras de reescrita são armazenadas no arquivo ApplicationHost.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%\inetpub\wwwroot. Nesse arquivo, você deverá ver a seção <rewrite> que contém a definição da regra:

<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>

A sintaxe acima também se aplica à configuração da Reescrita de URL em Web.config nos Sites do Windows Azure (WAWS).

Testando a regra de reescrita

Para testar se a regra reescreve corretamente as URLs, abra o navegador da web e solicite a seguinte URL:

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

Você deve ver que a regra de reescrita no servidor Web alterou a URL original para Article.aspx e passou "234" e "some-title" como valores para parâmetros de cadeia de caracteres de consulta.

Screenshot that shows the U R L Rewrite Module Test Page in Internet Explorer.

Criando uma regra de redirecionamento

Agora, vamos criar uma regra de redirecionamento que redirecionará todas as URLs no seguinte formato:

http://localhost/blog/some-other-title/543
para o seguinte formato:
http://localhost/article/543/some-other-title

Uma regra de redirecionamento permite que mais de uma URL aponte para uma só página da Web.

Para fazer isso, abra a interface do usuário do modo de exibição do recurso Reescrita de URL no Gerenciador do IIS. Clique em Adicionar Regra(s)... e selecione novamente o modelo Regra em Branco.

Na página Editar Regra, insira o seguinte:

  • Nome: Redirecionar do blog (este é um nome exclusivo para a regra.)
  • Padrão: ^blog/([_0-9a-z-]+)/([0-9]+) (Esse padrão corresponderá à cadeia de caracteres da URL que começa com "blog" e captura o segundo e o terceiro segmentos da URL em referências posteriores.)
  • Ação: Redirecionar (A ação de redirecionar fará com que uma resposta de redirecionamento seja enviada de volta ao navegador.)
  • URL de redirecionamento: article/{R:2}/{R:1} (Essa cadeia de caracteres de substituição será usada como uma URL de redirecionamento; observe que ela usa referências para preservar e reorganizar as partes da URL original capturadas durante a correspondência de padrões.)

Insira o nome, o padrão e a ação, conforme mostrado abaixo:

Screenshot that shows the Edit Inbound Rule pane. There are new entries for name, pattern and action.

Insira a URL de redirecionamento, conforme mostrado abaixo:

Screenshot that shows the Edit Inbound Rule pane. Under Action type, redirect has been selected and a Redirect U R L is entered.

Deixe valores padrão para todas as outras configurações. Salve a regra clicando em Aplicar no lado direito.

Testando a regra de redirecionamento

Para testar se a regra redireciona as solicitações corretamente, abra um navegador da web e solicite a seguinte URL:

http://localhost/blog/some-other-title/323

Você deve ver que o navegador foi redirecionado para http://localhost/article/323/some-other-title como resultado da execução da regra de redirecionamento e, em seguida, a solicitação foi reescrita de acordo com a regra de reescrita que você criou anteriormente.

Screenshot that shows Internet Explorer on the U R L Rewrite Module Test Page.

Criando uma regra de bloqueio de acesso

A terceira regra que criaremos é usada para bloquear todas as solicitações feitas a um site se essas solicitações não tiverem o cabeçalho de host definido. Esse tipo de regra é útil quando você deseja evitar tentativas de invasão feitas emitindo solicitações HTTP para o endereço IP do servidor em vez de usar o nome do host.

Criaremos essa regra sem usar o Gerenciador do IIS. Abra o arquivo Web.config na pasta %SystemDrive%\inetpub\wwwroot\ que você usou para o arquivo de teste article.aspx no início deste artigo. Localize a seção <rewrite>. Insira a seguinte regra na coleção de <regras> para que seja a primeira regra na coleção:

<rule name="Fail bad requests">
  <match url=".*"/>
  <conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
  </conditions>
  <action type="AbortRequest" />
</rule>

A seção <rewrite> deverá ser semelhante ao seguinte código:

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url=".*"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Redirect from blog">
      <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
      <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
    </rule>
    <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>

Vamos analisar a regra para entender o que ela faz.

<match url=".*"/>

O elemento acima diz que a regra corresponderá a qualquer cadeia de caracteres de URL.

<add input="{HTTP_HOST}" pattern="localhost" negate="true" />

O elemento acima adiciona uma condição à regra que recupera o valor do cabeçalho do host lendo a variável de servidor HTTP_HOST, faz a correspondência dela com o padrão "localhost" e, em seguida, nega o resultado da correspondência. Em outras palavras, a condição verifica se o cabeçalho do host não corresponde a "localhost".

<action type="AbortRequest" />

O elemento acima instrui o módulo de reescrita de URL a encerrar a solicitação HTTP.

Testando a regra de bloqueio de acesso

Para testar essa regra, abra um navegador da Web e faça uma solicitação para http://127.0.0.1/article/234/some-title. O que você deve ver é um navegador que não recebe nenhuma resposta do servidor. No entanto, se você solicitar http://localhost/article/234/some-title, o servidor Web responderá com êxito.

A exibição malsucedida será a seguinte:

Screenshot that shows a browser saying, This page can't be displayed.

A exibição bem-sucedida será a seguinte:

Screenshot that shows the U R L Rewrite Module Test Page in a browser.

Resumo

Neste passo a passo, você aprendeu a configurar regras de regravação de URL usando o gerenciador do IIS ou editando manualmente arquivos Web.config. As regras criadas neste passo a passo demonstraram alguns dos recursos importantes do Módulo de Reescrita de URL, como suporte a expressões regulares e a capacidade de usar cabeçalhos HTTP e variáveis de servidor para tomar decisões de reescrita.