Compartilhar via


Como Usar Regras de Reescrita Global e Distribuída

por Ruslan Yakushev

Esse passo a passo explicará os diferentes tipos de regras compatíveis com o módulo de reescrita de URL e orientará você sobre como configurar regras de reescrita globais e distribuídas.

Tela de fundo

As regras de reescrita global são usadas para definir a lógica de reescrita de URL em todo o servidor. Essas regras são definidas no arquivo applicationHost.config e não podem ser substituídas ou desabilitadas em níveis de configuração inferiores, como site ou diretório virtual. As regras globais sempre operam no caminho de URL absoluto (ou seja, URI solicitado sem o nome do servidor). Por exemplo, se uma solicitação foi feita, a http://localhost/directory1/directory2/index.html, o módulo de reescrita de URL passará "directory1/directory2/index.html" como uma entrada para uma regra global.

As regras de reescrita distribuída são usadas para definir a lógica de reescrita de URL específica para um escopo de configuração específico. As regras distribuídas podem ser definidas em qualquer nível de configuração (exceto arquivo) usando arquivos web.config. As regras locais sempre operam em URLs relativas ao local do arquivo Web.config em que elas são definidas. Por exemplo, se uma solicitação foi feita a http://localhost/directory1/directory2/index.html e uma regra de reescrita foi definida no arquivo Web.config localizado no directory1, o módulo de reescrita de URL passará "directory2/index.html" como uma entrada para essa regra.

O conjunto de regras global é sempre avaliado primeiro e, depois desse conjunto de regras distribuídas, será avaliado usando uma cadeia de caracteres de URL produzida pelo conjunto de regras global.

Pré-requisitos

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

  1. IIS 7.0 ou superior com serviço de função do ASP.NET habilitado
  2. Reescrita de URL da versão do Go Live instalada

Como configurar um cenário passo a passo

Para demonstrar como usar regras globais e locais, implementaremos um cenário comum de mapeamento de subdomínios para diretórios. Isso nos permitirá usar subdomínios para acessar conteúdo em diretórios diferentes em nosso site. Por exemplo, os usuários poderão navegar até http://blog.mysite.com em vez de http://mysite.com/blog, ou em http://forum.mysite.com vez de http://mysite.com/forum.

Para configurar o cenário, execute as seguintes etapas:

  1. Crie duas pastas chamadas "blog" e "fórum" na pasta %SystemDrive%\inetpub\wwwroot\.

  2. Copie o seguinte código asp.net e coloque-o na pasta %SystemDrive%\inetpub\wwwroot\blog 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>
          <p>This page is located in blog subdomain.</p>
          <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>
    
  3. Copie o seguinte código asp.net e coloque-o na pasta %SystemDrive%\inetpub\wwwroot\forum em um arquivo chamado forum.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>
          <p>This page is located in forum subdomain.</p>
          <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>
    
  4. Abra o arquivo chamado "hosts", localizado em %SystemDrive%\windows\system32\drivers\etc\ e adicione as duas linhas a seguir:

    127.0.0.1 forum_localhost
    127.0.0.1 blog_localhost
    

    Depois de adicionar essas linhas, abra um navegador da Web e navegue até http://blog_localhost/blog/article.aspx e http://forum_localhost/forum/forum.aspx e verificar se as páginas foram renderizadas corretamente em um navegador.

Como criando uma regra de reescrita global

Primeiro, criaremos uma regra de reescrita global que reescreve a URL com base no cabeçalho do host. Por exemplo, se a solicitação foi feita a http://blog_localhost/article.aspx, então, a regra alterará o caminho da URL para "/blog/article.aspx".

Para criar uma regra global usando a interface do usuário de reescrita de URL no Gerenciador do IIS, siga estas etapas:

  1. Ir para o Gerenciador do IIS
  2. No modo de exibição de árvore de navegação, selecione o nó do servidor.
  3. No Modo de Exibição de Recurso, clique em "Módulo de Reescrita de URL"
    Screenshot of the WIN two K eight R T M home page. The U R L Rewrite icon is highlighted.
  4. No painel "Ações", clique em "Adicionar regras..."
    Screenshot of the U R L Rewrite page. In the Actions pane Add Rules is highlighted.
  5. Na caixa de diálogo "Adicionar Regras", selecione "Regra em Branco" e clique em "Ok":
    Screenshot of the Add Rules dialog box. The Blank Rule icon is selected.

Agora devemos definir a regra de reescrita real. Na regra de reescrita do Módulo de Reescrita de URL, é 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 o padrão foi correspondido e todas as verificações de condições foram bem-sucedidas

Nomeando uma regra

Na caixa de texto "Nome", insira um nome que identificará exclusivamente a regra, por exemplo: "Mapeamento de subdomínio".

Como definir um padrão

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

(.*)

Essa cadeia de caracteres é uma expressão regular que especifica que o padrão corresponderá a qualquer string de URL, incluindo uma cadeia de caracteres vazia e capturará a cadeia de caracteres correspondente em uma referência inversa.

Como definir uma condição

Clique no botão "Adicionar Condições":

Screenshot of the Edit Rule page. In the Conditions category, Add Conditions is highlighted.

Clique em "Adicionar..." para abrir a caixa de diálogo para definir condições.

Screenshot of the Edit Rule page. The Add button in the Conditions category is highlighted.
Em "Entrada de condição:" digite essa cadeia de caracteres: "{HTTP_HOST}". Isso configura o módulo de reescrita de URL para usar o valor do cabeçalho de host de solicitação http como uma entrada para a condição

Na caixa de combinação suspensa, selecione "Corresponde ao padrão".

Na caixa de texto "Padrão", digite "^([^_]+)_[^_]+". Essa expressão regular será usada para corresponder aos domínios que criamos (blog_localhost e forum_localhost) e capturará a parte da cadeia de caracteres antes do símbolo "_" em uma referência de fundo. Por exemplo, para a cadeia de caracteres "blog_localhost", ela manterá o "blog" na referência inversa.

Depois que todas as propriedades tiverem sido especificadas, a caixa de diálogo de condição deverá ser exibida como abaixo:

Screenshot of the Edit Condition dialog box. In the Condition input box the text bracket H T T P underscore HOST close bracket is written. The Ignore case checkbox is checked.

Clique em OK para salvar a condição e retornar à interface do usuário "Adicionar Regra".

Como definir uma ação

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

{C:1}/{R:1}

Essa cadeia de caracteres especifica para que a URL de entrada deve ser reescrita. A referência inversa à condição {C:1} é usada como um nome da pasta e, em seguida, o que foi capturado no padrão de regra é preservado usando referência inversa para a regra {R:1}.

Deixe valores padrão para todas as outras configurações. A interface do usuário "Editar Regra" deve ser exibida como a seguinte página:

Screenshot of the Edit Rule page. The Input, Type, and Pattern columns all have text.

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

Para entender como essa regra será aplicada, vamos percorrer as etapas executadas pelo módulo de reescrita de URL quando o cliente HTTP solicitar essa URL:
http://blog_localhost/article.aspx?id=323:

  1. O módulo de reescrita de URL passa "article.aspx?id=323" como uma URL de entrada para a regra, corresponde com êxito ao padrão de regra e captura-o em uma referência de regra de volta {R:1}
  2. O valor do cabeçalho do host ("blog_localhost") é correspondido com êxito com a expressão regular "^([^_]+)_[^_]+" e, como resultado, "blog" é capturado em uma condição de referência inversa {C:1}
  3. De acordo com a cadeia de caracteres de substituição {C:1}/{R:1}, a URL é reescrita para "blog/article.aspx?id=323".

Como testar a regra

Para testar se a regra reescreve corretamente as URLs, abra o navegador da Internet e solicite a seguinte URL:
http://blog_localhost/article.aspx?id=123

Screenshot of the U R L Rewrite Module Test Page. The Server Variable information and the Value information is shown.

Você deve ver que o módulo de reescrita de URL alterou a URL e abriu uma página Article.aspx no diretório "blog". As alterações feitas pelo módulo de reescrita de URL foram baseadas nas informações extraídas do cabeçalho do host.

Da mesma forma, quando você solicitar http://forum_localhost/forum.aspx?id=345, a URL será reescrita como /forum/forum.aspx?id=345.

Como criar regras distribuídas

A regra global que acabamos de criar foi usada para mapear a solicitação para uma pasta com base nas informações extraídas do cabeçalho do host. Agora, criaremos regras distribuídas que nos permitirão ter URLs sem parâmetros de cadeia de caracteres de consulta. As regras distribuídas tomarão como entrada a URL, que já foi modificada pela regra global e executará modificações adicionais nela. Especialmente:

  • Uma regra de reescrita na pasta "blog" reescreverá o caminho da URL de "article/234/some-title" para "article.aspx?id=234&title=some-title"
  • Uma regra de reescrita na pasta "fórum" reescreverá o caminho da URL de "topic/123/some-topic-title" para "forum.aspx?topic=some-topic-title&id=123"

As regras locais podem ser criadas usando o Gerenciador do IIS ou editando arquivos web.config. Para fins de demonstração, criaremos as regras editando manualmente arquivos web.config.

Para criar regras de reescrita distribuídas:

  1. Crie um arquivo web.config vazio na pasta %SystemDrive%\inetpub\wwwroot\**blog**. Abra-o no editor de texto e cole o seguinte código XML nele:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <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>
      </system.webServer>
    </configuration>
    
  2. Crie um arquivo web.config vazio na pasta %SystemDrive%\inetpub\wwwroot\**forum**. Abra-o no editor de texto e cole o seguinte código XML nele:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="Rewrite to forum.aspx">
              <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/>
              <action type="Rewrite" url="forum.aspx?topic={R:2}&amp;id={R:1}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    

Testar regras globais e distribuídas

Para testar se todas as regras funcionam corretamente juntas, abra um navegador da Web e faça uma solicitação para http://blog_localhost/article/234/some-title. A resposta no navegador deve indicar que a URL foi alterada pela primeira vez por uma regra global e, em seguida, foi modificada adicionalmente por uma regra distribuída.

Da mesma forma, se você solicitar http://forum_localhost/topic/123/some-topic-title, verá que o módulo de reescrita de URL altera a cadeia de caracteres de URL solicitada para "/forum/forum.aspx?topic=some-topic-title&id=123".

Screenshot of the U R L Rewrite Module Test Page. The U R L string has changed.

Resumo

Nesse tutorial, você implementou um cenário de mapeamento de subdomínio usando a regra global e, em seguida, usou regras distribuídas para habilitar URLs amigáveis para páginas da Web nessas pastas.