URL sensible, o no, a las mayúsculas y minúsculas, configuración Apache

  • Por
Configuraciones diversas de Apache, en Linux, Windows y Mac en lo que respecta a las URL y su diferenciación entre mayúsculas y minúsculas (case sensitive / insensitive).

Este post lo publico porque he perdido un tiempo precioso para conseguir entender algunas cosillas sobre el sistema de archivos de un Mac, y no he encontrado en Internet una referencia completa que me hubiera explicado esto de manera clara y completa, así que espero que ayude a otras personas.

Es un tema de URLs y la diferenciación entre las mayúsculas y minúsculas, que a veces funciona de unas maneras y otras de otras. En inglés se conoce como "Case sensitive" cuando se diferencia entre mayúsculas y minúsculas y "case insensitive" al contrario (que es indiferente el tamaño de la caja).

Primero quiero mencionar una serie de datos importantes a tener en cuenta en lo que afecta a sistemas operativos y luego hablaré de algunas configuraciones de Apache que puedes realizar para alterar el comportamiento del servidor web.

Regla general Linux es Case Sensitive

Esto creo que lo sabemos la mayoría de las personas: index.php no es lo mismo que INDEX.php, porque Linux distingue entre mayúsculas y minúsculas. Por tanto, en cuanto a las URL:

http://example.com/index.php
http://example.com/INDEX.php

Son dos URL distintas y por lo tanto podrán tener contenidos distintos. En la mayoría de los sitios que se visitan se tiene a Linux como servidor, así que en la mayoría de los sitios de Internet esta característica será así.

Regla general, Windows es Case Insensitive

En Windows las mayúsculas y minúsculas de los nombres de archivos o directorios son indiferentes, por lo tanto, las dos URL anteriores son la misma, accederán a la misma página, mismo archivo, mismos contenidos.

Esto es un problema por dos puntos, entre otros:

  • Cuando desarrollas en Windows y te equivocas en una ruta, para escribirla con un tamaño de caja diferente, no observarás ningún problema, pero al subir el proyecto al servidor remoto (que suele ser Linux) encontrarás que no funcionan tus rutas si no usaste las mayúsculas y minúsculas apropiadamente.
  • Si estás trayendo un proyecto con nombres de archivos iguales, pero distinto tamaño de caja (por ejemplo en una misma carpeta tienes hola.php y HOLA.php) no podrás editar los archivos desde Windows, al menos uno de ellos, porque para este sistema es el mismo archivo.

No existe, que yo sepa, una manera de hacer que Windows se comporte como case-sensitive, lo que es un problema.

Caso especial, ordenador MAC OS X

Mi sorpresa es al saber que Mac OS X, a pesar de tener un sistema operativo basado en Unix, no distingue en muchos casos en mayúsculas y minúsculas. Depende de la instalación del sistema y de cómo haya sido formateado el disco de sistema.

Desde el terminal con el comando

diskutil list /

Podríamos ver el tipo de sistema que tenemos y averiguar si es o no sensible. No obstante, hay una operación práctica que puedes hacer para saberlo sin necesidad de investigar más. Simplemente creas dos archivos, con el mismo nombre y distinto tamaño de caja, desde terminal:

touch ARCHIVO.txt
touch archivo.txt

Si después de esos dos comandos listas el directorio (comando ls -l) y encuentras ambos archivos, es que tu sistema es sensible. Si es insensible a mayúsculas / minúsculas, observarás que solo se creó un archivo.

Módulo Apache mod_speling

Existe un módulo de Apache que te puede alterar la manera con la que se distinguen las URL, evitando tener en cuenta si son mayúsculas o minúsculas lo que figura en la URL. Se llama mod_speling y tiene un par de configuraciones posibles en lo que afecta al case sensitive.

CheckSpelling on|off

Esta configuración, que funcionará solo en el caso que tengamos mod_speling como "mod enabled", sirve para indicar que haga una serie de intentonas para encontrar un archivo parecido a la URL que se solicitó.

Por ejemplo, en la URL:

http://example.com/algo.php

Intentará buscar un archivo llamado Algo.php o ALGO.php, por ejemplo, dando como idénticas URL como example.com/ALGO.php.

Pero esta configuración también intentará hacer otro tipo de comprobaciones, como cambiar la extensión del archivo, para intentar encontrar una respuesta de una solicitud parecida.

Nota: Obviamente esta extensión reduce el rendimiento de la máquina por el hecho de Apache tener que buscar parecidos de una solicitud requerida.

Para que esta directiva solo afecte a las búsquedas en cuanto al tamaño de caja, podemos aplicar esta otra regla:

CheckCaseOnly on

En este caso el único comportamiento es que Apache devolverá archivos como si el sistema operativo el el que estamos sea case insensitive.

Nota: Ambas directivas las puedes aplicar a nivel del servidor, un virtualhost o un directorio con .htaccess. Obviamente, como decíamos, tienes que contar con el módulo de apache mod_speling. Más información en la página de este módulo: http://httpd.apache.org/docs/2.2/mod/mod_speling.html

Usando mod_rewrite

Otra opción que podrías usar en caso que quieras que tu sistema interprete de manera igual las URL, incluso con diferentes tamaños de caja (sin importar mayúsculas y minúsculas) sería la de convertir con un mod_rewrite las URL solicitadas por el servidor, para transformarlas todas en minúsculas antes de procesarlas. Encontrarás en Internet diversas páginas donde te dan alternativas de esta configuración que copiar y pegar en tu .htaccess.

Entorno Vagrant y la sensibilidad a mayúsculas y minúsculas

Aquí residió el problema que tuve y que originó este artículo. Primero comento los antecedentes.

Tengo un entorno de desarrollo con un Linux virtualizado, creado por medio de Vagrant. Al ser Linux, el sistema es "case sensitive". De hecho lo es y sin embargo, Apache se me comportaba como "case insensitive" y no entendía por qué ocurría.

El asunto es que mi Mac está en un disco que no es sensible a mayúsculas y minúsculas. Eso no afecta a la máquina virtual, que sigue siendo sensible. Sin embargo, la carpeta donde tengo el proyecto sobre el que estoy trabajando (desde Vagrant se puede compartir una carpeta de una manera cómoda, con el sistema virtualizado y el sistema host, de modo que puedas editar los archivos del proyecto desde tu propio ordenador, como cualquier otro archivo que no estuviera alojado en una máquina virtual) es una carpeta compartida entre Mac / Linux. Esa carpeta compartida no es sensible a mayúsculas y minúsculas, porque pertenece en primera instancia al Mac y por tanto, aunque Apache esté corriendo sobre Linux, está sirviendo archivos en un sistema case-insensitive y por tanto es indiferente para él las mayúsculas y las minúsculas en los nombres de archivos.

La recomendación para solventar este problema sería reinstalar el SO del Mac, OS X, haciendo que tenga una partición sensible a mayúsculas y minúsculas.

Espero que a alguien le venga bien este artículo y os ahorre unas horitas de pruebas e investigaciones.