Esta página contiene información sobre aspectos de la configuración de Apache y de PHP que no utilizo en clase, o que no es necesario explicar con todo detalle en clase porque forma parte de las prácticas más extendidas, pero que puede resultar de interés. Los aspectos que sí explico en clase se comentan en la lección Configuración de Apache y PHP.
Nota: En este curso no se recomienda el cambio de la directiva DocumentRoot, aunque se comente a continuación cómo hacerlo.
La directiva DocumentRoot especifica el directorio donde se encuentran las páginas web. Cuando en la barra de dirección del navegador se escriba una dirección que comience por http://localhost/, el servidor buscará los archivos a partir de ese directorio. La directiva DocumentRoot va acompañada de una directiva <Directory> que especifica qué servicios y características están permitidos o prohibidos en el directorio.
En XAMPP el valor predeterminado de DocumentRoot es el siguiente:
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# https://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks Includes ExecCGI
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
Si se quiere cambiar DocumentRoot y utilizar, por ejemplo, el directorio C:\www, hay que modificar tanto la línea de DocumentRoot como el Directory correspondiente. El archivo de configuración debería quedar así (se ha resaltado el texto añadido):
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
# 2024-09-12. Barto. He cambiado el directorio raíz del servidor
# DocumentRoot "C:/xampp/htdocs"
DocumentRoot "C:/www"
# 2024-09-12. Barto. He cambiado la directiva Directory de DocumentRoot
# <Directory "C:/xampp/htdocs">
<Directory "C:/www">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# https://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks Includes ExecCGI
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
Hay que tener cuidado con las erratas, ya que cualquier error impedirá que Apache se ponga en marcha.
Nota: En este curso no se recomienda el uso de UserDir, aunque se comente aquí cómo hacerlo.
Como en un ordenador con Windows puede haber varios usuarios, puede ser un problema que todos los usuarios utilicen el mismo directorio raíz. La directiva UserDir permite que cada usuario guarde sus páginas en su propio directorio Documentos y que cada uno acceda a ellos escribiendo en el navegador la dirección http://localhost/~nombre-de-usuario.
Hay que tener en cuenta que aunque se definan directorios de usuarios, http://localhost sigue mostrando el directorio indicado por la directiva DocumentRoot.
Para que Apache pueda acceder a los directorios de los usuarios, en httpd.conf debe estar cargado el módulo userdir mediante la directiva:
LoadModule userdir_module modules/mod_userdir.so
En XAMPP 1.8.3 esta directiva está comentada de forma predeterminada, por lo que es necesario borrar el carácter de almohadilla.
El archivo de configuración debería quedar así (se ha resaltado el texto añadido):
# 2024-09-12. Barto. Cargo el módulo userdir_module
LoadModule userdir_module modules/mod_userdir.so
Si se carga el módulo userdir, entonces deben indicarse los módulos de usuario mediante la directiva UserDir. En XAMPP 1.8.3 la configuración de los directorios de usuario se realiza en un archivo separado (aunque el contenido de este archivo podría incluirse en el archivo httpd.conf) que se encuentra referenciado mediante la directiva
Include conf/extra/httpd-userdir.conf
En XAMPP 1.8.3 esta directiva no está comentada de forma predeterminada, por lo que no es necesario modificarla, aunque conviene comprobarlo.
El archivo httpd-userdir.conf contiene las directivas UserDir y <Directory> que especifican la ubicación de los archivos de usuario y su modo de acceso.
El directorio de usuario se puede definir para todos los usuarios (utilizando el carácter *, como en el ejemplo siguiente) o para un usuario concreto, utilizando el nombre del usuario en vez del carácter *.
En el ejemplo siguiente la carpeta de usuario para todos los usuarios será la carpeta Mis documentos/www:
<IfModule userdir_module>
# 2024-09-12. Barto. He añadido este Directorio de usuario para todos los usuarios:
UserDir "Documents/www"
<Directory "C:\Users\*\Documents\www">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</IfModule>
Hay que tener cuidado con las erratas, ya que cualquier error impedirá que Apache se ponga en marcha.
Los fragmentos de código PHP se deben identificar mediante las etiquetas <?php .... ?>. La directiva short_open_tag especifica si también se admiten las etiquetas <? ... ?>.
Directiva / Valor | Significado |
---|---|
short_open_tag=On | Se admite el uso de <? ... ?> en vez de <?php ... ?> |
short_open_tag=Off | No se admite el uso de <? ... ?> en vez de <?php ... ?> (Valor recomendado) |
Se recomienda que esta directiva tome el valor Off y que se utilice siempre la etiqueta <?php para empezar los fragmentos de código php.
short_open_tag=Off ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con valor Off, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
Si en el servidor la directiva toma el valor On, las páginas que contengan una declaración XML (páginas XHTML o dibujos SVG, por ejemplo) producirían un error. Este problema se resolvería utilizando un fragmento de código para generar la declaración XML.
<?xml version="1.0" encoding="UTF-8"?>
<?php
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">\n";
?>
La directiva display_errors establece si PHP incluye los distintos mensajes de error en la salida del programa.
Directiva / Valor | Significado |
---|---|
display_errors=On | Se incluyen los mensajes de error en la salida del programa |
display_errors=Off | No se incluyen los mensajes de error en la salida del programa |
En un entorno de desarrollo se recomienda que esta directiva tome el valor On (para que el programador identifique más fácilmente los errores en sus programas), pero en un entorno de producción se recomienda que esta directiva tome el valor Off (por motivos de seguridad, es decir, para que un posible atacante no identifique errores en los programas que pudieran utilizarse contra el servidor).
display_errors=On ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con valor On, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
Para acceder a la base de datos MySQL mediante la biblioteca PDO, debe estar activada la extensión PDO MySQL.
extension=pdo_mysql ; Valor recomendado en este curso
XAMPP 8.2 tiene activada la extensión PDO MySQL, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
La extensión pdo_mysql puede utilizar cualquiera de los dos drivers de bajo nivel: MySQL Client Library (libmysql) o MySQL Native Driver (mysqlnd). La elección del driver se realiza en la compilación de PHP. El driver nativo mysqlnd se introdujo en PHP 5.3.0. XAMPP utiliza el driver mysqlnd desde XAMPP 1.7.2 (agosto de 2009).
Para acceder a la base de datos SQLite mediante la biblioteca PDO, debe estar activada la extensión PDO SQLite.
extension=pdo_sqlite ; Valor recomendado en este curso
XAMPP 8.2 tiene activada la extensión PDO SQLite, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
Para utilizar sesiones mediante el mecanismo propio de PHP (es decir, sin necesidad de crear funciones propias), la directiva session.save_handler debe tener el valor files.
session.save_handler=files ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con el valor files, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
Algunos gestores de contenidos (CMS) tienen sus propias funciones de gestión de sesiones y requieren que esta directiva tome el valor user. Si en nuestro servidor el valor es user, para evitar conflictos nuestros programas pueden modificar esta directiva en tiempo de ejecución, mediante la función ini_set("session.save_handler", "files"); (véase la lección sobre sesiones).
Las sesiones normalmente almacenan el identificador de sesión en forma de cookie en el ordenador del usuario. En caso de las cookies estén deshabilitadas en el navegador, las sesiones no funcionarán. La directiva session.use_trans_sid permite utilizar sesiones aunque las cookies estén desactivadas, añadiendo el identificador de la sesión a la dirección de la página como un control más. En general no se aconseja ese uso, pues hace visible al usuario el identificador de la sesión y, sin querer, el usuario puede enviarlo a otra persona que podría acceder a la misma sesión desde otro ordenador.
session.use_trans_sid=0 ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con el valor 0, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
Las funciones relacionadas con fechas y horas se configuran mediante varias directivas.
La directiva date.timezone establece la zona horaria predeterminada para todas las funciones de fecha y hora.
Al instalar XAMPP 8.2, el instalador asigna un valor estimado de la zona horaria (por eso se añade al final del fichero de configuración por lo que hay dos apartados [Date] en el fichero). En el caso de España, XAMPP 8.2 asigna el valor Europe/Berlin que se puede cambiar al valor Europe/Madrid (hasta ahora no era necesario, puesto que entre Berlín y Madrid no hay diferencias horarias, pero eso puede cambiar en el futuro). Se puede consultar la lista completa de zonas horarios permitidas en el manual de php.
; 2024-09-12. Barto. He cambiado el nombre del huso horario a Madrid
; date.timezone=Europe/Berlin
date.timezone=Europe/Madrid
En el primer apartado [Date] se muestran otras cuatro directivas relacionadas (que no están definidas porque están comentadas):
; https://www.php.net/date.default-latitude
;date.default_latitude = 31.7667
; https://www.php.net/date.default-longitude
;date.default_longitude = 35.2333
; https://www.php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.83333
; https://www.php.net/date.sunset-zenith
;date.sunset_zenith = 90.83333
Estas directivas se han declararon obsoletas en PHP 8.1 y se eliminarán en PHP 9.0, por lo que se desaconseja su uso.
La latitud y longitud anteriores corresponden a la ciudad de Jerusalén. Si se quieren asignar los valores correspondientes a la ciudad de Madrid, por ejemplo, habría que cambiarlos a:
; 2024-09-12. Barto. He cambiado la latitud a Madrid: 40 25 02 N = 40.4173
; https://www.php.net/date.default-latitude
;date.default_latitude = 31.7667
date.default_latitude=40.4173
; 2024-09-12. Barto. He cambiado la longitud a Madrid: 3 42 22 W = -3.7063
; https://www.php.net/date.default-longitude
;date.default_longitude = 35.2333
date.default_longitude=-3.7063
; https://www.php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.83333
; https://www.php.net/date.sunset-zenith
;date.sunset_zenith = 90.83333
La directiva post_max_size especifica el tamaño máximo de los datos que pueden enviarse al servidor.
La directiva upload_max_filesize especifica el tamaño máximo de un fichero que se envíe al servidor.
Lógicamente, post_max_size debe ser superior a upload_max_filesize. Si el valor se expresa sin unidades, se interpreta como bytes. Se pueden utilizar las unidades K (kilobytes), M (megabytes) y G (Gigabytes).
post_max_size=40M ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con el valor 40M, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
upload_max_filesize=40M ; Valor recomendado en este curso
En XAMPP 8.2 esta directiva viene predeterminada con el valor 40M, por lo que no es necesario modificarla, aunque conviene comprobar su valor.
La extensión fileinfo permite detectar el tipo MIME de un archivo.
extension=fileinfo
XAMPP 8.2 tiene activada la extensión FileInfo, por lo que no es necesario modificarla.
En este curso de PHP no se utiliza esta extensión, pero sí que se necesita en el curso de Aplicaciones Web (por ejemplo, con OwnCloud).
Nota:
<?php
// Este programa comprueba el tipo MIME de un archivo cualquiera
// Para probarlo, copie un archivo cualquiera (exe, zip, png, jpg, txt, etc.),
// cambie su nombre (por ejemplo tmp.tmp) y escriba su ruta (por ejemplo C:/tmp):
$archivo = "C:/tmp/tmp.tmp";
// Se muestran los errores por si acaso
ini_set("display_errors", "on");
// El código siguiente está basado en OC/lib/helper.php
if (function_exists("finfo_open") && function_exists("finfo_file") && $finfo = finfo_open(FILEINFO_MIME)) {
$info = finfo_file($finfo, $archivo);
if ($info) {
$mimeType = substr($info, 0, strpos($info, ";"));
print "<p>El tipo MIME del archivo $archivo es: $mimeType</p>\n";
} else {
print "<p>No se ha obtenido información sobre el tipo del archivo.</p>\n";
}
finfo_close($finfo);
} else {
print "<p>La extensión fileinfo no se ha encontrado. Compruebe su configuración.</p>\n";
}
?>
En la lección Cambios en Apache se comentan aspectos de Apache que he dejado de explicar en clase porque han quedado "viejos" o se pueden abordar de una forma más "moderna":