Uso de Drupal con Apache sin .htaccess

khaled-ali-DxkbYY8uehU-unsplash.jpg
Solucionex
20
Ene 23

Los archivos .htaccess son archivos con los que se puede modificar la configuración del servidor web para una carpeta específica. Esto estaba bien en la época en la que reinaban los hostings compartidos, donde no se podía modificar directamente la configuración del servidor web para adaptarla a las necesidades de la web en sí.

A día de hoy es más común poder controlar el servidor web, ya sea en nativo o usando docker, por lo que estos archivos .htaccess, aunque puedan parecer útiles, lo único que hacen es empeorar el rendimiento de una web, ya que al estar la opción de su uso activada (cosa que viene por defecto en apache), hace que en cada carpeta tenga que pararse a comprobar si existe dicho archivo, y si existe, cargar su contenido.

Para deshabilitar los archivos .htaccess, cambiar en el archivo .conf que sirve el sitio (para este post, se toma que la raíz de la web es "/var/www/html/web"):

<Directory "/var/www/html/web/">
  # Disable .htaccess
  AllowOverride None
</Directory>

Traduciendo los .htaccess de Drupal a configuración de Apache

Para seguir obteniendo las mismas configuraciones que Drupal incluye por defecto en los .htaccess sin la pérdida de rendimiento que conlleva su uso, puede traspasarse su contenido al archivo .conf que sirve la web. En los ejemplos de este post se usa contenido de los .htaccess de la versión 9.5.

.htaccess principal (carpeta raíz del sitio, normalmente "web" o "docroot")

Básicamente hay que copiar el contenido del .htaccess bajo la directiva "Directory" de la raíz de la web. Ejemplo de las primeras líneas:

<Directory "/var/www/html/web/">
  # Disable .htaccess
  AllowOverride None

  # Protect files and directories from prying eyes.
  <FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config|yarn\.lock|package\.json)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$">
    <IfModule mod_authz_core.c>
      Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
      Order allow,deny
    </IfModule>
  </FilesMatch>
</Directory>

.htaccess de la carpeta files

<Directory "/var/www/html/web/sites/default/files">
  # Turn off all options we don't need.
  Options -Indexes -ExecCGI -Includes -MultiViews

  # Set the catch-all handler to prevent scripts from being executed.
  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
  <Files *>
    # Override the handler again if we're run later in the evaluation list.
    SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
  </Files>

  # If we know how to do it safely, disable the PHP engine entirely.
  <IfModule mod_php7.c>
    php_flag engine off
  </IfModule>
  <IfModule mod_php.c>
    php_flag engine off
  </IfModule>
</Directory>

Otros .htaccess

Drupal genera un .htaccess para la carpeta de configuración y para la carpeta de archivos privados. Como buena práctica está recomendado sacar estas carpetas de la raíz de la web (una carpeta por encima de la carpeta que sirve el servidor web), por lo que no sería necesario integrar su contenido.

A tener en cuenta

Hay que recordar que si en alguna actualización cambia el contenido del .htaccess, hay que actualizar el .conf de apache y recargar el servicio o el contenedor.

Fuentes

Web oficial de apache

Ejemplo de cómo deshabilitarlo

 

Imagen del post: Khaled Ali (Unsplash)