Módulos e .htaccess
Aula 2 de 5
Gerenciamento de Módulos
Comandos a2enmod / a2dismod (Debian/Ubuntu)
# Listar módulos disponíveis
sudo apache2ctl -M
sudo ls /etc/apache2/mods-available/
# Listar módulos ativos
sudo ls /etc/apache2/mods-enabled/
# Habilitar módulos
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod expires
sudo a2enmod deflate
sudo a2enmod proxy proxy_http proxy_balancer
sudo a2enmod alias
# Desabilitar módulos não utilizados
sudo a2dismod autoindex
sudo a2dismod status
# Recarregar configuração
sudo systemctl reload apache2
No RHEL/CentOS (módulos no httpd.conf)
# /etc/httpd/conf.modules.d/00-base.conf
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# Reiniciar
sudo systemctl restart httpd
Principais Módulos
mod_rewrite
RewriteEngine On
RewriteRule ^/antigo/(.*)$ /novo/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
mod_alias
# Alias para diretórios fora do DocumentRoot
Alias /docs "/var/shared/documentation"
<Directory "/var/shared/documentation">
Require all granted
</Directory>
# Redirect
Redirect 301 /old-page.html /new-page.html
RedirectMatch 301 ^/blog/(.*)$ https://blog.exemplo.com/$1
mod_expires
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
mod_deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css application/javascript
AddOutputFilterByType DEFLATE application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
mod_proxy
ProxyRequests Off
ProxyPass /api/ http://localhost:3000/
ProxyPassReverse /api/ http://localhost:3000/
<Proxy *>
Require all granted
</Proxy>
.htaccess
Habilitando AllowOverride
# No VirtualHost ou httpd.conf
<Directory /var/www/site>
AllowOverride All
# Ou restrito a diretivas específicas:
# AllowOverride None
# AllowOverride FileInfo Options
# AllowOverride All
</Directory>
Exemplos de .htaccess
# Ativar rewrite engine
RewriteEngine On
# Redirecionar www para sem www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# Redirecionar HTTP para HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Bloquear acesso a arquivos ocultos
RedirectMatch 403 /\..*$
# Proteger wp-admin (WordPress)
<Files wp-login.php>
Require ip 192.168.1.0/24
</Files>
# Cache de arquivos estáticos
<FilesMatch "\.(css|js|png|jpg|jpeg|gif|ico)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# Bloquear user agents maliciosos
RewriteCond %{HTTP_USER_AGENT} (libwww|wget|curl|python) [NC]
RewriteRule ^.* - [F,L]
Segurança em .htaccess
# Proteger o próprio .htaccess
<Files ".ht*">
Require all denied
</Files>
# Desabilitar acesso a arquivos de configuração
<FilesMatch "\.(bak|config|sql|md|env)$">
Require all denied
</FilesMatch>
# Prevenir hotlinking de imagens
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?seudominio\.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?google\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|svg)$ - [F,NC]
# Headers de segurança
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Boas Práticas de Segurança
# 1. Remover módulos desnecessários
sudo a2dismod autoindex info userdir
# 2. Desabilitar listagem de diretórios globalmente
echo "Options -Indexes" | sudo tee /etc/apache2/conf-available/no-indexes.conf
sudo a2enconf no-indexes
# 3. Restringir acesso a áreas administrativas
# Usar AllowOverride None em diretórios críticos
# 4. Logar tentativas de acesso negado
LogLevel warn rewrite:trace3
# 5. Usar cabeçalhos de segurança
Header always set Strict-Transport-Security "max-age=31536000"
Lab: Configurando Módulos e .htaccess
Crie uma estrutura completa com módulos ativos e regras de .htaccess.
# 1. Habilitar módulos necessários
sudo a2enmod rewrite headers expires deflate
sudo systemctl reload apache2
# 2. Verificar módulos ativos
sudo apache2ctl -M | grep -E "rewrite|headers|expires|deflate"
# 3. Criar estrutura de diretórios
sudo mkdir -p /var/www/lab-modulos/{public,assets,admin}
# 4. Criar página de exemplo
cat << 'HTACCESS' | sudo tee /var/www/lab-modulos/public/.htaccess
RewriteEngine On
RewriteRule ^admin/(.*)$ ../admin/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
HTACCESS
# 5. Criar configuração de VirtualHost
cat << 'VHOST' | sudo tee /etc/apache2/sites-available/lab-modulos.conf
<VirtualHost *:80>
ServerName lab.local
DocumentRoot /var/www/lab-modulos/public
<Directory /var/www/lab-modulos/public>
AllowOverride All
Options -Indexes +FollowSymLinks
</Directory>
<Directory /var/www/lab-modulos/admin>
AllowOverride None
Require ip 127.0.0.1
</Directory>
# Compressão
AddOutputFilterByType DEFLATE text/html text/plain text/css
# Cache headers
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/lab-modulos-error.log
CustomLog ${APACHE_LOG_DIR}/lab-modulos-access.log combined
</VirtualHost>
VHOST
# 6. Habilitar site e testar
sudo a2ensite lab-modulos.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
Módulos bem gerenciados reduzem a superfície de ataque e melhoram a performance. Ative apenas o necessário e use .htaccess com moderação — prefira configurar no VirtualHost sempre que possível.