Exemplos de .htaccess para CMS populares: como restaurar o arquivo padrão

O arquivo .htaccess é um arquivo de configuração usado em servidores web Apache para gerenciar as configurações do site sem acesso à configuração principal do servidor. Com ele, você pode ativar redirecionamentos, restringir acesso, configurar URLs amigáveis para SEO, configurar cache e muito mais – diretamente da raiz do seu site ou de qualquer um de seus diretórios.
Muitos CMS criam este arquivo automaticamente na instalação ou incluem um modelo na distribuição.
Se você trabalha com hospedagem, especialmente em Apache, é importante saber como é o .htaccess padrão para diferentes CMSs. Isso ajuda você a:
-
Verificar se tudo está correto após a instalação;
-
Restaurar o arquivo se ele foi acidentalmente excluído;
-
Entender quais regras o sistema usa "pronto para usar".
Onde o .htaccess está localizado
O arquivo .htaccess geralmente é encontrado na pasta raiz do site, por exemplo:
/var/www/site.com/public_html/.htaccess
Se o arquivo estiver faltando (por exemplo, se foi acidentalmente excluído), você pode criá-lo manualmente com o nome .htaccess (o nome começa com um ponto, sem extensão).
Abra o arquivo com um editor de texto (por exemplo, Notepad++ ou VS Code).
Não use pacotes de escritório (como o MS Word) para editar, pois eles podem inserir caracteres ocultos que quebrarão o arquivo.
Abaixo está uma coleção de arquivos .htaccess padrão usados por padrão em CMS populares. Esses exemplos podem ser úteis se você excluiu ou corrompeu acidentalmente o arquivo .htaccess original e precisa restaurá-lo para que seu site funcione corretamente.
WordPress
O .htaccess padrão do WordPress habilita URLs "limpas" e inclui regras básicas de redirecionamento:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Se um multisite com subdomínios for usado (por exemplo, site1.example.com, site2.example.com):
# BEGIN WordPress Multisite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# Redirect for multisite (subdomains)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress Multisite
Se um multisite com subdiretórios for usado (por exemplo, example.com/site1, example.com/site2):
# BEGIN WordPress Multisite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# Redirect for multisite (subdirectories)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress Multisite
Joomla 2.5-3
O Joomla usa .htaccess para proteção básica e configuração SEF:
##
# @package Joomla
# @copyright Copyright (C) 2005 - 2012 Open Source Matters. All rights reserved.
# @license GNU General Public License version 2 or later; see LICENSE.txt
##
##
# READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE!
#
# The line just below this section: 'Options +FollowSymLinks' may cause problems
# with some server configurations. It is required for use of mod_rewrite, but may already
# be set by your server administrator in a way that dissallows changing it in
# your .htaccess file. If using it causes your server to error out, comment it out (add # to
# beginning of line), reload your site in your browser and test your sef url's. If they work,
# it has been set by your server administrator and you do not need it set here.
##
## Can be commented out if causes errors, see notes above.
Options +FollowSymLinks
## Mod_rewrite in use.
RewriteEngine On
## Begin - Rewrite rules to block out some common exploits.
# If you experience problems on your site block out the operations listed below
# This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block out any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root homepage
RewriteRule .* index.php [F]
#
## End - Rewrite rules to block out some common exploits.
## Begin - Custom redirects
#
# If you need to redirect some pages, or set a canonical non-www to
# www redirect (or vice versa), place that code here. Ensure those
# redirects use the correct RewriteRule syntax and the [R=301,L] flags.
#
## End - Custom redirects
##
# Uncomment following line if your webserver's URL
# is not directly related to physical file paths.
# Update Your Joomla! Directory (just / for root).
##
# RewriteBase /
## Begin - Joomla! core SEF Section.
#
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]
#
## End - Joomla! core SEF Section.
Joomla 4-5
Em Joomla 4, dá-se mais atenção à segurança e ao cache:
##
# @package Joomla
# @copyright (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
# @license GNU General Public License version 2 or later; see LICENSE.txt
##
##
# READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE!
#
# The line 'Options +FollowSymLinks' may cause problems with some server configurations.
# It is required for the use of Apache mod_rewrite, but it may have already been set by
# your server administrator in a way that disallows changing it in this .htaccess file.
# If using it causes your site to produce an error, comment it out (add # to the
# beginning of the line), reload your site in your browser and test your sef urls. If
# they work, then it has been set by your server administrator and you do not need to
# set it here.
##
## MISSING CSS OR JAVASCRIPT ERRORS
#
# If your site looks strange after enabling this file, then your server is probably already
# gzipping css and js files and you should comment out the GZIP section of this file.
##
## OPENLITESPEED
#
# If you are using an OpenLiteSpeed web server then any changes made to this file will
# not take effect until you have restarted the web server.
##
## Can be commented out if causes errors, see notes above.
Options +FollowSymlinks
Options -Indexes
## No directory listings
<IfModule mod_autoindex.c>
IndexIgnore *
</IfModule>
## Suppress mime type detection in browsers for unknown types
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
## Protect against certain cross-origin requests. More information can be found here:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP)
## https://web.dev/why-coop-coep/
#<IfModule mod_headers.c>
# Header always set Cross-Origin-Resource-Policy "same-origin"
# Header always set Cross-Origin-Embedder-Policy "require-corp"
#</IfModule>
## Disable inline JavaScript when directly opening SVG files or embedding them with the object-tag
<FilesMatch "\.svg$">
<IfModule mod_headers.c>
Header always set Content-Security-Policy "script-src 'none'"
</IfModule>
</FilesMatch>
## These directives are only enabled if the Apache mod_rewrite module is enabled
<IfModule mod_rewrite.c>
RewriteEngine On
## Begin - Rewrite rules to block out some common exploits.
# If you experience problems on your site then comment out the operations listed
# below by adding a # to the beginning of the line.
# This attempts to block the most common type of exploit `attempts` on Joomla!
#
# Block any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root home page
RewriteRule .* index.php [F]
#
## End - Rewrite rules to block out some common exploits.
## Begin - Custom redirects
#
# If you need to redirect some pages, or set a canonical non-www to
# www redirect (or vice versa), place that code here. Ensure those
# redirects use the correct RewriteRule syntax and the [R=301,L] flags.
#
## End - Custom redirects
##
# Uncomment the following line if your webserver's URL
# is not directly related to physical file paths.
# Update Your Joomla! Directory (just / for root).
##
# RewriteBase /
## Begin - Joomla! core SEF Section.
#
# PHP FastCGI fix for HTTP Authorization, required for the API application
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# -- SEF URLs for the API application
# If the requested path starts with /api, the file is not /api/index.php
# and the request has not already been internally rewritten to the
# api/index.php script
RewriteCond %{REQUEST_URI} ^/api/
RewriteCond %{REQUEST_URI} !^/api/index\.php
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the /api/index.php script
RewriteRule .* api/index.php [L]
# -- SEF URLs for the public frontend application
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]
#
## End - Joomla! core SEF Section.
</IfModule>
## These directives are only enabled if the Apache mod_rewrite module is disabled
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When Apache mod_rewrite is not available, we instruct a temporary redirect
# of the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 302 ^/$ /index.php/
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
## GZIP
## These directives are only enabled if the Apache mod_headers module is enabled.
## This section will check if a .gz file exists and if so will stream it
## directly or fallback to gzip any asset on the fly
## If your site starts to look strange after enabling this file, and you see
## ERR_CONTENT_DECODING_FAILED in your browser console network tab,
## then your server is already gzipping css and js files and you don't need this
## block enabled in your .htaccess
<IfModule mod_headers.c>
# Serve gzip compressed CSS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]
# Serve gzip compressed JS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]
# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header set Content-Encoding gzip
# Force proxies to cache gzipped &
# non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
Drupal 7
O .htaccess no Drupal 7 inclui configurações básicas de segurança e otimização. Conteúdo típico:
# Use o seguinte para evitar assinaturas do servidor e navegação de diretório
ServerSignature Off
Options -Indexes
# Proteja arquivos sensíveis
<FilesMatch "\.(htaccess|htpasswd)">
Order Allow,Deny
Deny from all
</FilesMatch>
# Proteja arquivos contra acesso direto
<FilesMatch "\.(txt|md|yml|json|xml)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# Defina um fuso horário padrão para PHP
SetEnv TZ Europe/Amsterdam
# Habilite a compressão para melhor desempenho
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript
# Configurações de cache para melhor desempenho
<IfModule mod_headers.c>
Header set Cache-Control "public, max-age=3600"
</IfModule>
Drupal 8
Para Drupal 8, o .htaccess já inclui melhorias adicionais e suporta novos recursos. Por exemplo, há suporte a HTTP/2, segurança aprimorada, personalização para lidar com URLs limpas e cache.
# Evite navegação de diretório e assinaturas do servidor
ServerSignature Off
Options -Indexes
# Proteja arquivos sensíveis
<FilesMatch "\.(htaccess|htpasswd|ini|log|conf)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# Suporte a URLs limpas
RewriteEngine on
RewriteBase /
# Suporte para HTTP/2
<IfModule http2_module>
Protocols h2 http/1.1
</IfModule>
# Controle de cache para assets
<IfModule mod_headers.c>
Header set Cache-Control "public, max-age=86400, s-maxage=86400, must-revalidate"
</IfModule>
# Habilite a compressão
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript text/javascript
# Redireciona barras finais para URLs limpas
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /+$
RewriteRule ^(.*)/$ /$1 [R=301,L]
Drupal 9
Para Drupal 9, o .htaccess inclui mais aprimoramentos para trabalhar com tecnologias web mais novas, como suporte a HTTP/2 e medidas de segurança mais rigorosas.
# Evite navegação de diretório e assinaturas do servidor
ServerSignature Off
Options -Indexes
# Proteja arquivos sensíveis
<FilesMatch "\.(htaccess|htpasswd|ini|log|conf)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# Habilite URLs limpas (isso é essencial para o Drupal funcionar corretamente)
RewriteEngine on
RewriteBase /
# Suporte para HTTP/2 e cache moderno
<IfModule mod_http2.c>
Protocols h2 http/1.1
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "public, max-age=86400, s-maxage=86400, must-revalidate"
</IfModule>
# Habilite a compressão Gzip
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript
# Suporte a URLs limpas para Drupal
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /+$
RewriteRule ^(.*)/$ /$1 [R=301,L]