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.
Para seguir este tutorial, você precisará de:
Um servidor Debian 10 configurado seguindo o tutorial Debian 10 initial server setup guide, incluindo um usuário sudo não-root e um firewall.
O Apache instalado seguindo os Passos 1 e 2 do tutorial How To Install the Apache Web Server on Debian 10.
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:
- 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:
- 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.
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:
- 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:
<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:
- sudo apache2ctl configtest
Se não houver erros, reinicie o Apache para efetivar suas alterações:
- sudo systemctl restart apache2
Agora, crie um arquivo .htaccess
na raiz dos arquivos web, também chamado de web root:
- sudo nano /var/www/html/.htaccess
Adicione esta linha na parte superior do novo arquivo para ativar o mecanismo de reescrita.
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.
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:
- sudo nano /var/www/html/about.html
Copie o seguinte código HTML no arquivo, salve e feche-o.
<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:
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
:
- sudo nano /var/www/html/.htaccess
Após a primeira linha, adicione o seguinte RewriteRule
e salve o arquivo:
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.
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:
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:
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.
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:
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:
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.!-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 /
.
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.
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!