Cheatsheet Apache
Servidor web HTTP robusto e extensível com .htaccess
Apache
25
tarjetas encontradas
Categorías:
Versiones:
Configuração Básica
Archivos de config
# Debian/Ubuntu:
/etc/apache2/apache2.conf
/etc/apache2/sites-available/
/etc/apache2/ports.conf
# CentOS/RHEL:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/
Ubicación de los configs.
Comandos CLI
apachectl configtest # probar config
apachectl graceful # reload suave
systemctl restart apache2
systemctl status apache2
a2ensite site.conf # activar sitio
a2dissite site.conf # desactivar
a2enmod rewrite # activar módulo
Gestionar el servicio.
Módulos esenciales
a2enmod rewrite # URL rewrite
a2enmod ssl # HTTPS
a2enmod headers # headers custom
a2enmod proxy # reverse proxy
a2enmod proxy_http # proxy HTTP
a2enmod expires # cache headers
Activar funcionalidades.
Directivas principales
ServerRoot "/etc/apache2"
Listen 80
Listen 443
DocumentRoot "/var/www/html"
ServerName ejemplo.com
ServerAdmin admin@ejemplo.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Configuración global.
Virtual Hosts
Virtual host básico
<VirtualHost *:80>
ServerName ejemplo.com
ServerAlias www.ejemplo.com
DocumentRoot /var/www/ejemplo
<Directory /var/www/ejemplo>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Configurar dominio.
Múltiples sitios
<VirtualHost *:80>
ServerName app1.com
DocumentRoot /var/www/app1
</VirtualHost>
<VirtualHost *:80>
ServerName app2.com
DocumentRoot /var/www/app2
</VirtualHost>
Varios dominios en el mismo servidor.
Directory y permisos
<Directory /var/www/app>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /var/www/app/private>
Require ip 192.168.1.0/24
</Directory>
Controlar acceso por carpeta.
Alias y subdirectorios
Alias /docs /var/www/documentacion
<Directory /var/www/documentacion>
Require all granted
</Directory>
# Acceder en: ejemplo.com/docs/
Mapear rutas.
.htaccess
Estructura básica
# .htaccess en la raíz del proyecto
RewriteEngine On
# Redirigir a HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Config por directorio.
Cache y compresión
# Cache de estáticos:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
# Gzip:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/json
</IfModule>
Rendimiento.
SPA (React/Vue)
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
Frontend routing.
Laravel / PHP
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
# O en public/.htaccess:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Routing para PHP.
Bloquear y proteger
# Bloquear acceso a archivos:
<FilesMatch "\.(env|gitignore|md)$">
Require all denied
</FilesMatch>
# Proteger .git:
RedirectMatch 404 /\.git
# Desactivar listado:
Options -Indexes
Seguridad vía .htaccess.
mod_rewrite
Sintaxis RewriteRule
RewriteRule Pattern Substitution [Flags]
# Flags comunes:
[L] # Last (parar aquí)
[R=301] # Redirect permanente
[R=302] # Redirect temporal
[NC] # No Case (ignorar mayúsculas)
[QSA] # Query String Append
Estructura de las reglas.
RewriteCond
# Condiciones (antes de la Rule):
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/api/
Condiciones para reglas.
Ejemplos prácticos
# Quitar www:
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# URL amigable:
RewriteRule ^producto/([0-9]+)$ producto.php?id=$1 [L]
# Quitar .html:
RewriteRule ^([^\.]+)$ $1.html [L]
Casos de uso comunes.
Redirects
# Redirect simple:
Redirect 301 /antiguo /nuevo
RedirectMatch 301 ^/blog/(.*)$ /articulos/$1
# Redirect con Rewrite:
RewriteRule ^/viejo/(.*)$ /nuevo/$1 [R=301,L]
# Redirect condicional:
RewriteCond %{HTTP_HOST} ^old\.com$
RewriteRule ^(.*)$ https://new.com/$1 [R=301,L]
Redirecciones.
Segurança
SSL / HTTPS
<VirtualHost *:443>
ServerName ejemplo.com
SSLEngine on
SSLCertificateFile /etc/ssl/cert.pem
SSLCertificateKeyFile /etc/ssl/key.pem
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
</VirtualHost>
Configurar TLS.
Headers de seguridad
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security \
"max-age=31536000; includeSubDomains"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Protección con HTTP headers.
Ocultar información
# httpd.conf / apache2.conf:
ServerTokens Prod
ServerSignature Off
# Quitar header de versión:
Header unset X-Powered-By
# Desactivar TRACE:
TraceEnable Off
Minimizar exposición.
Proteger directorios
# Auth básica:
<Directory /var/www/admin>
AuthType Basic
AuthName "Área Restringida"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
# Crear: htpasswd -c .htpasswd user
Autenticación por carpeta.
Avançado
Reverse proxy
a2enmod proxy proxy_http
<VirtualHost *:80>
ServerName app.ejemplo.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
Proxy para Node/Python.
Proxy WebSocket
a2enmod proxy_wstunnel
ProxyPass /ws ws://127.0.0.1:8080/ws
ProxyPassReverse /ws ws://127.0.0.1:8080/ws
# O con Rewrite:
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /ws/(.*) ws://127.0.0.1:8080/$1 [P,L]
Soporte para WebSockets.
MPM y rendimiento
# /etc/apache2/mods-available/mpm_event.conf
<IfModule mpm_event_module>
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
Tuning de procesos.
Debug y logs
# Nivel de log:
LogLevel warn # debug, info, notice, warn, error
# Ver config activa:
apachectl -S # virtual hosts
apachectl -M # módulos activos
apachectl -t -D DUMP_VHOSTS
# Log personalizado:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
Diagnóstico y logging.