Tutorial

Como Reescrever URLs com mod_rewrite para Apache no Debian 10

Published on November 14, 2019
Português
Como Reescrever URLs com mod_rewrite para Apache no Debian 10

Introdução

O módulo mod_rewrite do Apache permite reescrever URLs de uma maneira mais limpa, traduzindo caminhos legíveis por humanos em strings de consulta ou query strings amigáveis ao código. Também permite reescrever URLs com base em condições.

Um arquivo .htaccess lhe permite criar e aplicar regras de reescrita sem acessar os arquivos de configuração do servidor. Ao colocar o arquivo .htaccess na raiz do seu site, você pode gerenciar as reescritas por site ou por diretório.

Neste tutorial, você habilitará o mod_rewrite e usará arquivos .htaccess para criar um redirecionamento básico de URL e depois explorar alguns casos de uso avançados.

Pré-requisitos

Para seguir este tutorial, você precisará de:

Passo 1 — Ativando o mod_rewrite

Para que o Apache entenda as regras de reescrita, primeiro precisamos ativar o mod_rewrite. Ele já está instalado, mas está desativado em uma instalação padrão do Apache. Use o comando a2enmod para ativar o módulo:

  1. sudo a2enmod rewrite

Isso ativará o módulo ou o alertará que o módulo já está ativado. Para colocar essas alterações em vigor, reinicie o Apache:

  1. sudo systemctl restart apache2

O mod_rewrite está agora totalmente ativado. Na próxima etapa, configuraremos um arquivo .htaccess que usaremos para definir regras de reescrita para redirecionamentos.

Passo 2 — Configurando o .htaccess

Um arquivo .htaccess nos permite modificar nossas regras de reescrita sem acessar os arquivos de configuração do servidor. Por esse motivo, o .htaccess é fundamental para a segurança de sua aplicação web. O ponto que precede o nome do arquivo garante que o mesmo esteja oculto.

Nota: Quaisquer regras que você possa colocar em um arquivo .htaccess também podem ser colocadas diretamente nos arquivos de configuração do servidor. De fato, a documentação oficial do Apache recomenda o uso de arquivos de configuração do servidor em vez do .htaccess, devido aos tempos de processamento mais rápidos.

No entanto, neste exemplo simples, o aumento de desempenho será desprezível. Além disso, definir regras no .htaccess é conveniente, especialmente com vários sites no mesmo servidor. Não é necessário reiniciar o servidor para que as alterações tenham efeito ou privilégios de root para editar regras, simplificando a manutenção e o processo de fazer alterações com uma conta sem privilégios. Softwares open-source populares como Wordpress e Joomla contam com arquivos .htaccess para fazer modificações e regras adicionais sob demanda.

Antes de começar a usar arquivos .htaccess, você precisará configurar e proteger mais algumas configurações.

Por padrão, o Apache proíbe o uso de um arquivo .htaccess para aplicar regras de reescrita, portanto, primeiro você precisa permitir alterações no arquivo. Abra o arquivo de configuração padrão do Apache usando nano ou seu editor de texto favorito:

  1. sudo nano /etc/apache2/sites-available/000-default.conf

Dentro desse arquivo, você encontrará um bloco <VirtualHost *:80> iniciando na primeira linha. Dentro desse bloco, adicione o novo bloco a seguir para que seu arquivo de configuração se pareça com o seguinte. Verifique se todos os blocos estão identados corretamente:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    . . .
</VirtualHost>

Salve e feche o arquivo. Se você usou o nano, faça isso pressionando CTRL+X, Y e, em seguida, ENTER.

Em seguida, verifique sua configuração:

  1. sudo apache2ctl configtest

Se não houver erros, reinicie o Apache para efetivar suas alterações:

  1. sudo systemctl restart apache2

Agora, crie um arquivo .htaccess na raiz dos arquivos web, também chamado de web root:

  1. sudo nano /var/www/html/.htaccess

Adicione esta linha na parte superior do novo arquivo para ativar o mecanismo de reescrita.

/var/www/html/.htaccess
RewriteEngine on

Salve o arquivo e saia.

Agora você tem um arquivo .htaccess operacional que pode ser usado para controlar as regras de roteamento da aplicação web. No próximo passo, criaremos um arquivo de exemplo de site que usaremos para demonstrar as regras de reescrita.

Passo 3 — Configurando as Reescritas de URL

Aqui, configuraremos uma reescrita básica de URL que converte URLs bonitas em caminhos reais para páginas. Especificamente, permitiremos aos usuários acessar http://ip_do_seu_servidor/about e exibir uma página chamada about.html.

Comece criando um arquivo chamado about.html no web root:

  1. sudo nano /var/www/html/about.html

Copie o seguinte código HTML no arquivo, salve e feche-o.

/var/www/html/about.html
<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>

Você pode acessar esta página em http://ip_do_seu_servidor/about.html, mas observe que, se tentar acessar http://ip_do_seu_servidor/about, você verá um erro 404 Not Found. Para acessar a página usando /about, criaremos uma regra de reescrita.

Todas as regras de reescrita ou RewriteRules seguem este formato:

General RewriteRule structure
RewriteRule pattern substitution [flags]
  • RewriteRule especifica a diretiva.
  • pattern é uma expressão regular que corresponde à string desejada da URL, que é o que o usuário digita no navegador.
  • substitution é o caminho para a URL real, ou seja, o caminho do arquivo que o Apache vai servir.
  • flags são parâmetros opcionais que podem modificar o funcionamento da regra.

Vamos criar nossa regra de reescrita de URL. Abra o arquivo .htaccess:

  1. sudo nano /var/www/html/.htaccess

Após a primeira linha, adicione o seguinte RewriteRule e salve o arquivo:

/var/www/html/.htaccess
RewriteEngine on
RewriteRule ^about$ about.html [NC]

Nesse caso, ^about$ é a string desejada, about.html é a substituição e [NC] é uma flag. Nosso exemplo usa alguns caracteres com significado especial:

  • ^ indica o início da URL, após ip_do_seu_servidor/.
  • $ indica o final da URL.
  • about busca correspondência com a string “about”.
  • about.html é o arquivo real que o usuário acessa.
  • [NC] é a flag que torna a regra insensível a maiúsculas e minúsculas.

Agora você pode acessar http://ip_do_seu_servidor/about no seu navegador. De fato, com a regra mostrada acima, as seguintes URLs também apontarão para about.html:

  • http://ip_do_seu_servidor/about, por causa da definição da regra.
  • http://ip_do_seu_servidor/About, porque a regra não diferencia maiúsculas de minúsculas.
  • http://ip_do_seu_servidor/about.html, porque o nome do arquivo original sempre funcionará.

No entanto, o seguinte não funcionará:

  • http://ip_do_seu_servidor/about/, porque a regra declara explicitamente que não pode haver nada após about, pois o caracter $ aparece após about.
  • http://ip_do_seu_servidor/contact, porque isso não vai conicidir com a string about na regra.

Agora você tem um arquivo .htaccess operacional com uma regra básica que pode ser modificada e ampliada para suas necessidades. Nas seções a seguir, mostraremos dois exemplos adicionais de diretivas usadas com freqüência.

Examplo 1 — Simplificando Query Strings com RewriteRule

As aplicações web geralmente usam strings de consulta ou query strings, que são adicionadas a uma URL usando um ponto de interrogação (?) após o endereço. Parâmetros separados são delimitados usando um E comercial (&). As query strings podem ser usadas para transmitir dados adicionais entre páginas individuais de aplicações.

Por exemplo, uma página de resultados de pesquisa escrita em PHP pode usar uma URL como http://example.com/results.php?item=shirt&season=summer. Neste exemplo, dois parâmetros adicionais são passados para o script de aplicação imaginário results.php: item, com o valor shirt, e season com o valor summer. A aplicação pode usar as informações da query string para criar a página certa para o visitante.

As regras de reescrita do Apache geralmente são empregadas para simplificar links longos e desagradáveis, como o exemplo acima, em URLs amigáveis ou friendly URLs que são mais fáceis de digitar e interpretar visualmente. Neste exemplo, gostaríamos de simplificar o link acima para se tornar http://example.com/shirt/summer. Os valores dos parâmetros shirt e summer ainda estão no endereço, mas sem a query string e o nome do script.

Aqui está uma regra para implementar isso:

Simple substition
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

O shirt/summer é explicitamente correspondido no endereço solicitado e o Apache é instruído a servir results.php?item=shirt&season=summer no lugar.

As flags [QSA] são comumente usadas em regras de reescrita. Eles dizem ao Apache para anexar qualquer query string adicional à URL servida, portanto, se o visitante digitar http://example.com/shirt/summer?page=2 o servidor irá responder com results.php?item=shirt&season=summer&page=2. Sem ela, a query string adicional seria descartada.

Embora esse método atinja o efeito desejado, o nome do item e a estação são codificados fisicamente na regra. Isso significa que a regra não funcionará para outros itens, como pants, ou para outras estações, como winter.

Para tornar a regra mais genérica, podemos usar expressões regulares para combinar partes do endereço original e usá-las em um padrão de substituição. A regra modificada ficará assim:

Simple substition
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

O primeiro grupo de expressões regulares entre parênteses corresponde a uma string contendo caracteres alfanuméricos e números como shirt ou pants e salva o fragmento correspondente como a variável $1. O segundo grupo de expressões regulares entre parênteses faz a correspondência exata de summer, winter, fall, ou spring, e, da mesma forma, salva o fragmento correspondente como $2.

Os fragmentos que correspondem são então usados na URL resultante nas variáveis item e season, em vez dos valores shirt e summer fisicamente codificados que usamos anteriormente.

O que foi apresentado acima irá converter, por exemplo, http://example.com/pants/summer para http://example.com/results.php?item=pants&season=summer. Este exemplo também não fica obsoleto, permitindo que vários itens e estações sejam reescritos corretamente usando uma única regra.

Examplo 2 — Adicionando Condições com Lógica Usando RewriteConds

As regras de reescrita nem sempre são avaliadas uma a uma, sem limitações. A diretiva RewriteCond nos permite adicionar condições às nossas regras de reescrita para controlar quando as regras serão processadas. Todos os RewriteConds seguem o seguinte formato:

General RewriteCond structure
RewriteCond TestString Condition [Flags]
  • RewriteCond especifica a diretiva RewriteCond.
  • TestString é a string a ser testada.
  • Condition é o padrão ou a condição a ser correspondida.
  • Flags são parâmetros opcionais que podem modificar as condições e as regras de avaliação.

Se um RewriteCond for avaliado como verdadeiro, a próxima RewriteRule será considerada. Caso contrário, a regra será descartada. Múltiplos RewriteConds podem ser usados um após o outro, embora todos devam ser avaliados como verdadeiros para que a próxima regra seja considerada.

Como exemplo, suponha que você gostaria de redirecionar todas as solicitações para arquivos ou diretórios inexistentes no seu site de volta à página inicial, em vez de mostrar a página de erro padrão 404 Not Found. Isso pode ser conseguido com as seguintes regras condicionais:

Redirect all requests to non-existent files and directories to home page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

Com o exposto acima:

  • %{REQUEST_FILENAME} é a string a ser verificada. Nesse caso, é o nome do arquivo solicitado, que é uma variável do sistema disponível para cada solicitação.
  • -f é uma condição interna que verifica se o nome solicitado existe no disco e é um arquivo. O ! é um operador de negação. Combinado, !-f é avaliado como verdadeiro apenas se o nome especificado não existir ou não for um arquivo.
  • De maneira similar, !-d é avaliado como verdadeiro somente se o nome especificado não existir ou não for um diretório.

O RewriteRule na linha final entrará em vigor apenas para solicitações de arquivos ou diretórios inexistentes. O RewriteRule em si é muito simples e redireciona todas as solicitações para a raiz do site /.

Conclusão

O mod_rewrite lhe permite criar URLs amigáveis e legíveis por humanos. Neste tutorial, você aprendeu como usar a diretiva RewriteRule para redirecionar URLs, incluindo aquelas com query strings. Você também aprendeu como redirecionar condicionalmente URLs usando a diretiva RewriteCond.

Se você quiser saber mais sobre o mod_rewrite, dê uma olhada em Apache’s mod_rewrite Introduction e Apache’s official documentation for mod_rewrite.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Manager, Developer Education

Technical Writer @ DigitalOcean



Default avatar

Software Engineer, CTO @Makimo

Creating bespoke software ◦ CTO & co-founder at Makimo. I’m a software enginner & a geek. I like making impossible things possible. And I need tea.



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Become a contributor for community

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

DigitalOcean Documentation

Full documentation for every DigitalOcean product.

Resources for startups and SMBs

The Wave has everything you need to know about building a business, from raising funding to marketing your product.

Get our newsletter

Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

New accounts only. By submitting your email you agree to our Privacy Policy

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.