kb.erickguedes.com
Apache HTTP Server: Configuração e Administração

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.