Volver al índice Configuración de Apache y PHP


Introducción

Esta explicación sobre la configuración de Apache y PHP está adaptada a XAMPP 1.7.3.

Cada vez que se modifica alguno de los ficheros de configuración es necesario detener y reiniciar el servidor. En XAMPP 1.7.3 se puede utilizar para ello el panel de control de XAMPP (Inicio > Programas > XAMPP for Windows > XAMPP Control Panel).

Cómo modificar los archivos de configuración

Antes de modificar cualquier archivo de configuración, se recomienda hacer una copia de seguridad del archivo de configuración original.

Si al modificar algún archivo de configuración nos equivocamos e introducimos errores, es probable que el servidor no pueda arrancar. Si no somos capaces de encontrar el error, siempre podemos restaurar en archivo de configuración original y empezar de nuevo, sin necesidad de reinstalar los programas.

Al modificar cualquier archivo de configuración, es conveniente documentar los cambios. Para ello, recomiendo hacer tres cosas:

Por ejemplo, la siguiente línea es una línea del archivo de configuración de Apache:

DocumentRoot "C:/xampp/htdocs"

En caso de modificarla, el archivo de configuración quedaría así (se ha resaltado el texto añadido):

# 2010-01-21. Barto. He cambiado el directorio raíz del servidor
# DocumentRoot "C:/xampp/htdocs"
DocumentRoot "C:/www"

Volver al principio de la página


Configuración de Apache

El fichero de configuración de Apache es el archivo httpd.conf, un archivo de texto sin formato.

En httpd.conf las líneas comentadas empiezan por el carácter almohadilla (#). En Windows, al escribir una ruta de directorio en httpd.conf se puede utilizar tanto la barra como la contrabarra (es decir, se puede escribir tanto C:\xampp como C:/xampp).

En XAMPP 1.7.3 el archivo httpd.conf se encuentra en el directorio C:\xampp\apache\conf\.

Se comentan a continuación algunas directivas de configuración de Apache. Antes de modificar cualquier archivo de configuración, se recomienda hacer una copia de seguridad del archivo de configuración original.


Ubicación de las páginas web

Con la configuración inicial de XAMPP 1.7.3, al abrir en el navegador una página web cuya dirección empieza por http://localhost/ el comportamiento de Apache es el siguiente:

Esta configuración es adecuada para entornos de programación, pero en entornos de producción se suele modificar, por ejemplo, para no enviar el listado del directorio.

En el directorio raíz del servidor, XAMPP 1.7.3 instala una serie de páginas que permiten administrar el servidor, por eso al abrir en el navegador la dirección http://localhost se abre una página de configuración propia de XAMPP.

A la hora de añadir otras páginas en el servidor, se puede hacer de varias formas:

En clase, dado que sólo hay un usuario de Windows, optaremos por la solución de crear alias, uno para cada alumno que utilice el ordenador.


DocumentRoot

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ña de una directiva <Directory> que especifica qué servicios y características están permitidos o prohibidos en el directorio.

En XAMPP 1.7.3 el valor predeterminado de DocumentRoot es el siguiente:

DocumentRoot "C:/xampp/htdocs"

 ... (se han omitido varias líneas del archivo de configuración)

<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
    # http://httpd.apache.org/docs/2.2/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:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>

Si se quiere utilizar, por ejemplo, el directorio C:\www, el archivo de configuración debería quedar así (se ha resaltado el texto añadido):

# 2010-01-21. Barto. He cambiado el directorio raíz del servidor
# DocumentRoot "C:/xampp/htdocs"
DocumentRoot "C:/www"

 ... (se han omitido varias líneas del archivo de configuración)

# 2010-01-21. 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
    # http://httpd.apache.org/docs/2.2/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:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>

Volver al principio de la página


UserDir

Como en un ordenador con Windows XP 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 Mis 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.7.3 esta directiva está comentada de forma predeterminada, por lo que es necesario borrar el carácter de almohadilla.


Si se carga el módulo userdir, entonces deben indicarse los módulos de usuario mediante la directiva UserDir. En XAMPP 1.7.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.7.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 archivo que instala XAMPP 1.7.3 debe modificarse para definir el directorio de usuario concreto, como en el ejemplo siguiente, en el que Windows está instalado en C:/, el usuario se llama "ASI SP" y la carpeta en la que se encuentran las páginas web es "Mis documentos/www".

<IfModule userdir_module>

    # 2010-01-21. Barto. He añadido este Directorio de usuario:
    UserDir "Mis documentos/www"
    <Directory "C:/Documents and Settings/ASI SP/Mis documentos/www">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
   </Directory>

</IfModule>

Hay que tener cuidado con las erratas, ya que cualquier error impedirá que Apache se ponga en marcha.

Volver al principio de la página


Alias

La directiva Alias permite que el servidor abra páginas que no estén dentro del directorio establecido mediante la directiva DocumentRoot.

Para que Apache pueda acceder a esos directorios, en el archivo httpd.conf debe estar cargado el módulo alias mediante la directiva:

LoadModule alias_module modules/mod_alias.so

En XAMPP 1.7.3 esta directiva no está comentada de forma predeterminada, por lo que no es necesario modificarla, aunque conviene comprobarlo.

Además, hay que añadir en el archivo httpd.conf una directiva Alias dentro de la directiva <IfModule alias_module> (que ya existe en XAMPP 1.7.3).

Como ejemplo, vamos a crear un par de alias. Supongamos que hay dos alumnos que utilizan el mismo usuario de Windows y cada uno quiere guardar su páginas en Mis Documentos y acceder a ellas a través del servidor. Así:

Para ello, hay que añadir en el archivo httpd.conf dos directivas Alias dentro de la directiva <IfModule alias_module>. Si ya existe la directiva IfModule (como ocurre en XAMPP 1.7.3), sólo habría que añadir las líneas en negrita del ejemplo siguiente:

<IfModule alias_module>

    # 2010-01-21. Ana. He añadido este Alias:
    Alias /ana "C:/Documents and Settings/ASI SP/Mis documentos/Ana/PHP"
    <Directory "C:/Documents and Settings/ASI SP/Mis documentos/Ana/PHP">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
    </Directory>

    # 2010-01-21. Benito. He añadido este Alias:
    Alias /benito "C:/Documents and Settings/ASI SP/Mis documentos/Benito/PHP"
    <Directory "C:/Documents and Settings/ASI SP/Mis documentos/Benito/PHP">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
    </Directory>
ScriptAlias /cgi-bin/ "C:/xampp/cgi-bin/" </IfModule>

Como se ha comentado en el apartado de la directiva DocumentRoot, se debe incluir una directiva <Directory> para el directorio indicado en la directiva Alias.

Hay que tener cuidado con las erratas, ya que cualquier error impedirá que Apache se ponga en marcha.

Volver al principio de la página


Configuración de PHP

El archivo de configuración de PHP es el archivo php.ini, un archivo de texto sin formato.

En php.ini las líneas comentadas empiezan por el carácter punto y coma (;).

En XAMPP 1.7.3 el archivo php.ini se encuentra en el directorio C:\xampp\php\php.ini.

Se comentan a continuación algunas directivas de configuración de PHP, aunque también se puede consultar el manual de PHP. Antes de modificar cualquier archivo de configuración, se recomienda hacer una copia de seguridad del archivo de configuración original.

Nota: La ruta del archivo php.ini que se está utilizando se indica en el campo "Loaded Configuration File" de la primera tabla que muestra la función phpinfo(). En el menú de la página de administración de XAMPP 1.7.3 hay una opción phpinfo() que muestra la configuración de PHP.


short_open_tag

Los fragmentos de código PHP se identifican mediante las etiquetas <?php .... ?>. La directiva short_open_tag especifica si también se admiten las etiquetas <? ... ?>.

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

En XAMPP 1.7.3 esta directiva viene predeterminada con valor Off, por lo que no es necesario modificarla, aunque conviene comprobarlo.


Si en el servidor la directiva toma el valor On, las páginas XHTML que contengan una declaración XML (por ejemplo, <?xml version="1.0" encoding="iso-8859-1"?>) producirán un error. Este problema se resuelve utilizando un fragmento de código para generar la declaración XML.

<?xml version="1.0" encoding="iso-8859-1"?> Parse error: parse error, unexpected T_STRING in ejemplo.php on line 1
<?php print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"; ?>

Volver al principio de la página


register_globals

La directiva register_globals especifica si las variables EGPCS (Entorno, GET, POST, Cookies y Servidor) se registran automáticamente como variables globales.

register_globals = On Las variables EGPCS se registran como variables globales
register_globals = Off Las variables EGPCS no se registran como variables globales (Valor recomendado)

Por motivos de seguridad, se recomienda que esta directiva tome el valor Off.

register_globals = Off

En XAMPP 1.7.3 esta directiva viene predeterminada con valor Off, por lo que no es necesario modificarla, aunque conviene comprobarlo.


En versiones antiguas de PHP (o si la directiva register_globals toma el valor On), las variables EGPCS eran variables globales, por lo que se podían llamar directamente. Por ejemplo, si un formulario tiene un control con nombre "prueba" y se envía con el valor "Hola", el documento PHP que lo recibe puede utilizar la variable $prueba directamente.

<?php print "$prueba"; ?> Hola

Sin embargo, cuando la directiva register_globals toma el valor Off, se produce el aviso siguiente:

<?php print "$prueba"; ?> Notice: Undefined variable: prueba in ejemplo.phpon line 1

La forma correcta de acceder al dato recibido es a través de la matriz $_REQUEST (o $_POST o $_GET):

<?php print "$_REQUEST[prueba]"; ?> Hola

Volver al principio de la página


error_reporting

La directiva error_reporting especifica el tipo de errores notificados por PHP. Por ejemplo:

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED Se muestran todos los errores, menos los avisos y obsoletos.
error_reporting = E_ALL | E_STRICT Se muestran todos los errores (Valor recomendado)

En un entorno de producción, se suelen omitir los mensajes de error por motivos de seguridad, pero en un entorno de producción es conveniente mostrar el mayor número de errores y avisos para corregirlos.

En XAMPP 1.7.3 esta directiva viene predeterminada con el valor E_ALL & ~E_NOTICE & ~E_DEPRECATED, por lo que conviene modificarla a E_ALL | E_STRICT.

; 2010-01-21. Barto. He cambiado el error_reporting para mostrar todos los errores
; error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
error_reporting = E_ALL | E_STRICT

El problema de utilizar una configuración tan exigente es que algunos paquetes de terceros (blbliotecas, CMS, etc.) pueden dejar de funcionar y a veces no queda más remedio que volver a un valor menos estricto para poderlos utilizar.


Los posibles valores de esta directiva, que se pueden combinar con & (o con | en el caso de E_STRICT), son los siguientes:

Tipo de error Descripción
E_ALL Todos los errores y avisos excepto E_STRICT.
E_ERROR Errores fatales detectados en tiempo de ejecución.
E_WARNING Advertencias (errores no fatales) detectados en tiempo de ejecución.
E_PARSE Errores de sintaxis detectados en tiempo de compilación.
E_NOTICE Avisos detectados en tiempo de ejecución (pueden deberse a errores involuntarios o a errores intencionados, por ejemplo, utilizar una variable no inicializada, pero utilizarla teniendo en cuenta que se inicializará automáticamente a una cadena vacía).
E_STRICT Avisos detectados en tiempo de ejecución, al activarlos PHP sugiere cambios en el código para que una mejor interoperabilidad y compatibilidad en el futuro.
E_RECOVERABLE_ERROR Error recuperable.
E_DEPRECATED Advertencias sobre código obsoleto que no funcionará en futuras versiones de PHP.
E_CORE_ERROR Errores fatales detectados durante el arranque inicial de PHP.
E_CORE_WARNING Advertencias (errores no fatales) detectados durante el arranque inicial de PHP.
E_COMPILE_ERROR Erores fatales detectados en tiempo de compilación.
E_COMPILE_WARNING Advertencias (errores no fatales) detectados en tiempo de compilación.
E_USER_ERROR Mensajes de error generados por el usuario.
E_USER_WARNING Advertencias generadas por el usuario.
E_USER_NOTICE Avisos generados por el usuario.
E_USER_DEPRECATED Advertencias generadas por el usuario sobre código que no funcionará en futuras versiones de PHP.

Para mostrar todos los errores la directiva error_reporting debe tomar el valor E_ALL | E_STRICT.

Volver al principio de la página


extensión mysqli

Nota: En este curso no se utilizará esta extensión. La conexión con las bases de datos se realizarán a través de PDO.

Para acceder a la base de datos MySQL, existen varias extensiones. La extensión mysql es la versión más antigua, mientras que la extensión mysqli es una versión más moderna, especialmente diseñada para sacar partido de PHP 5.0 y MySQL 4.1 (o posteriores). Además, existen dos drivers de bajo nivel: MySQL Client Library (libmysql) o MySQL Native Driver (mysqlnd).

extension=php_mysqli_libmysql.dll

XAMPP 1.7.3 tiene activada tanto la extensión mysql como la extensión mysqli, por lo que no es necesario modificarla, aunque conviene comprobarlo.

Volver al principio de la página


extensión pdo_mysql

Para acceder a la base de datos MySQL mediante la biblioteca PDO, debe estar activada la extensión PDO MySQL. Además, existen dos drivers de bajo nivel: MySQL Client Library (libmysql) o MySQL Native Driver (mysqlnd).

extension=php_pdo_mysql_libmysql.dll

XAMPP 1.7.3 tiene activada la extensión con el driver libmysql, por lo que no es necesario modificarla, aunque conviene comprobarlo.

Volver al principio de la página


extensión pdo_sqlite

Para acceder a la base de datos SQLite mediante la biblioteca PDO, debe estar activada la extensión PDO SQLite.

extension=php_pdo_sqlite.dll

XAMPP 1.7.3 tiene activada la extensión PDO SQLite, por lo que no es necesario modificarla, aunque conviene comprobarlo.

Volver al principio de la página


session.save_handler

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

En XAMPP 1.7.3 esta directiva viene predeterminada con el valor files, por lo que no es necesario modificarla, aunque conviene comprobarlo.

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 nuestra instalación de Apache 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).

Volver al principio de la página


magic quotes

Algunos caracteres deben "escaparse" (es decir, colocar una contrabarra \ antes del carácter) antes de poderse utilizar en consultas a bases de datos, ya que esos caracteres tienen significados especiales y provocarían resultados inesperados (o lo que es peor, provocados por usuarios maliciosos). El mecanismo de las comillas mágicas (magic quotes) se introdujo en PHP 3 para evitar ese problema y consiste en que si la directiva magic_quotes_gpc tiene el valor On, PHP escapa automáticamente todos los datos recibidos por los mecanismos GPC (Get/Post/Cookie).

magic_quotes_gpc = On comillas mágicas activadas
magic_quotes_gpc = Off comillas mágicas desactivadas (Valor recomendado)

El problema es que las comillas mágicas no resuelven todos los problemas y generan problemas en otras situaciones, por lo que actualmente se recomienda que esta directiva tome el valor Off (y tener en cuenta en los programas que la directiva puede tener el valor On).

En lugar de las comillas mágicas el programador debe utilizar las funciones específicas de cada base de datos para evitar ese problema, o escapar explícitamente una cadena utilizando la función addslashes().

magic_quotes_gpc = Off

En XAMPP 1.7.3 está directiva viene predeterminada con el valor Off, por lo que no es necesario modificarla, aunque conviene comprobarlo.

Volver al principio de la página


date.timezone

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 1.7.3, el instalador da un valor estimado de la zona horaria. En el caso de España, XAMPP 1.7.3 da el valor Europe/Paris que se puede cambiar al valor Europe/Madrid (que es el mismo, claro). Se puede consultar la lista completa de zonas horarios permitidas en la web de php.

; 2010-01-21. Barto. He cambiado el nombre del huso horario a Madrid
; date.timezone = "Europe/Paris"
date.timezone = "Europe/Madrid"

Junto la la directiva date.timezone se muestran las otros cuatro directivas (aunque no están definidas porque están comentadas:

; http://php.net/date.default-latitude
;date.default_latitude = 31.7667

; http://php.net/date.default-longitude
;date.default_longitude = 35.2333

; http://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.583333

; http://php.net/date.sunset-zenith
;date.sunset_zenith = 90.583333

La latitud y longitud predeterminadas corresponden a la ciudad de Jerusalén. Si se quieren asignar los valores correspondientes a la ciudad de Madrid, habría que cambiarlos a

; 2010-01-21. Barto. He cambiado la latitud a Madrid: 40 25 02 N = 40.4173
; http://php.net/date.default-latitude
;date.default_latitude = 31.7667
date.default_latitude = 40.4173

; 2010-01-21. Barto. He cambiado la longtud a Madrid: 3 42 22 W = -3.7063
; http://php.net/date.default-longitude
;date.default_longitude = 35.2333
date.default_longitude = -3.7063

; http://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.583333

; http://php.net/date.sunset-zenith
;date.sunset_zenith = 90.583333

Volver al principio de la página


post_max_size y upload_max_filesize

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).

Volver al principio de la página

Esta página forma parte del curso "Páginas web con PHP" disponible en http://www.mclibre.org
Autor: Bartolomé Sintes Marco
Última modificación: 2 de marzo de 2010

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.