Habilitación de bonitos enlaces permanentes en WordPress: la configuración de Apache no funciona

8 minutos de lectura

avatar de usuario
usuario de prueba

Probablemente este error tenga una solución bastante fácil, pero he estado buscando esto durante mucho tiempo y aún no obtengo el error. Creo que he intentado todo lo que pude.

Problema: cuando habilito bonitos enlaces permanentes en mi instalación de wordpress (por lo que está usando /%postname%/), no funciona. Obtengo un 404 en todas las páginas excepto en la página de inicio.

Esta página http://codex.wordpress.org/Permalinks me dice los requisitos para que funcionen los enlaces permanentes:

  • Servidor web Apache con el módulo mod_rewrite instalado
  • En el directorio de inicio de WordPress,
    • La opción FollowSymLinks habilitada
    • Directivas FileInfo permitidas (por ejemplo, AllowOverride FileInfo o AllowOverride All)
    • Un archivo .htaccess (si falta este archivo, WordPress intentará crearlo cuando active los enlaces permanentes “bonitos”)
    • Si desea que WordPress actualice el archivo .htaccess automáticamente, WordPress necesitará acceso de escritura al archivo.

Se ha instalado el servidor web Apache, el módulo mod_rewrite se ha cargado con el comando de reescritura a2enmod (y el servidor se ha reiniciado varias veces después). Entonces, en /etc/apache2/mods-enabled, está presente el enlace simbólico a rewrite.load. Además, cuando ejecuto el comando phpinfo, veo que se ha cargado el módulo mod_rewrite. Puedes comprobar esto también aquí: http://namorti.com/phpinfo.php

Luego, en /etc/apache2/sites-enabled, no había ningún “predeterminado” presente. Copié 000-default.conf al valor predeterminado y luego lo edité. Contiene lo siguiente: DocumentRoot /var/www

    <Directory />
            Options FollowSymLinks Indexes
            AllowOverride FileInfo
    </Directory>

En lo que a mí respecta, se ha habilitado FollowSymLinks y se permiten las directivas FileInfo.

En cuanto a los dos últimos puntos, en mi directorio de inicio de wordpress (/var/www), .htaccess está presente y WordPress puede escribirlo (actualicé la estructura de enlaces permanentes un par de veces y actualiza el archivo .htaccess en consecuencia). Ahora mismo contiene lo siguiente:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Entonces, hasta donde yo sé, DEBERÍA estar funcionando. Reinicié el servidor (servicio de reinicio apache2) varias veces. No veo lo que me estoy perdiendo. ¿Alguien tiene una pista aquí?

¡Gracias por adelantado!

* EDITAR *

Entonces, hice lo que calcinai me dijo que hiciera… Edité mi archivo /etc/apache2/sites-enabled/default (que contiene el vhost). Ahora se ve así:

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin www.namorti.com
    DocumentRoot /var/www

    <Directory /var/www>
            Options MultiViews
            AllowOverride None
            Order allow,deny
            allow from all

            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.php$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . /index.php [L]
    </Directory>
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

He reiniciado apache nuevamente, pero desafortunadamente todavía no funciona. Honestamente, me hubiera sorprendido, porque mover las directivas del archivo .htaccess al vhost funcionaría si htaccess en sí mismo funcionara, ya que todo lo demás me pareció lo suficientemente correcto…

¿Cualquier otra sugerencia? ¡Gracias por el esfuerzo!

avatar de usuario
calcinado

Asegúrate que AllowOverrides directiva se establece en all en el host virtual – eso es lo que le dice a apache que busque .htaccess archivos en la raíz web.

Una mejor solución es en realidad poner sus directivas de reescritura en el vhost, ya que claramente tiene acceso de escritura al archivo. Cuando tiene activado AllowOverrides, apache buscará en el directorio y en todos los directorios principales los archivos .htaccess en cada solicitud, lo que puede ser un gran impacto en el rendimiento.

Para WordPress, su vhost debería verse así:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/site

    <Directory /var/www/site> 
        Options Indexes FollowSymLinks
        AllowOverride None 
        Order allow,deny 
        allow from all 

        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
    </Directory> 
</VirtualHost>

  • Desafortunadamente no funcionó. Vea la pregunta, la edité para mostrar cómo se ve mi vhost ahora.

    – usuario de prueba

    13 de septiembre de 2013 a las 9:14

  • Resuelto. Tenía que ver con el archivo 000-default.conf: lo copié a predeterminado y lo edité predeterminado; pero aparentemente el servicio está usando el archivo 000-default.conf en sí mismo. Además: su sugerencia no funcionó, con esto en mi vhost en 000-default.conf recibí un error 403 Prohibido. Con el contenido de WordPress sugerido (que originalmente tenía por defecto), todo funciona de maravilla. ¡¡Gracias por la ayuda!!

    – usuario de prueba

    13 de septiembre de 2013 a las 9:22

  • Probablemente se deba a que se omite la directiva FollowSymLinks. ¡Lo siento!

    – calcinai

    13/09/2013 a las 21:39

  • Totalmente correcto, un poco tonto de mi parte no revisar el registro o no ver que era solo el FollowSymLinks. Ahora funciona de maravilla, así que lo mantendré así porque es más eficiente. ¡¡Gracias!!

    – usuario de prueba

    15/09/2013 a las 17:41

  • Enfriar. Salí de la Indexes directiva allí desde sus opciones originales, pero si no está usando índices, le recomiendo que la elimine, ya que ha habido varios complementos de WordPress que eran vulnerables cuando estaba activado.

    – calcinai

    15/09/2013 a las 22:25


Lo resolví yo mismo.

Tenía que ver con el archivo “000-default.conf”. Lo copié en “predeterminado” y edité “predeterminado”, como ya mencioné en mi pregunta.

Aparentemente, el servicio está usando el archivo “000-default.conf” en sí mismo. Al copiar el archivo “predeterminado” nuevamente a “000-default.conf” y reiniciar el servicio apache, todo funciona ahora.

Una advertencia: la sugerencia de calcinai parece que debería funcionar, pero con su sugerencia en mi vhost en el archivo “000-default.conf” correcto, obtuve un error 403 Prohibido. Cuando reemplacé su contenido con mi contenido original

DocumentRoot /var/www
<Directory />
        Options FollowSymLinks Indexes
        AllowOverride FileInfo
</Directory>

Y luego, una vez más, reiniciando el servicio de apache, todo funcionó.

Gracias calcinai por tu esfuerzo para tratar de ayudarme 🙂

  • Lo siento, simplemente no había copiado tu Options directiva correctamente. Casi apostaría a que si miras los registros de apache cuando estabas recibiendo ese 403, te diría que agregues FollowSymLinks

    – calcinai

    13/09/2013 a las 21:55

  • Recuerde sudo a2enmod reescribir

    –Anthony Horne

    15 de octubre de 2020 a las 12:27

avatar de usuario
Thanga Mariappan P.

Problema de enlace permanente

Dentro de este archivo, queremos cambiar todas las cosas.

sudo nano /etc/apache2/sites-available/000-default.conf
000-default.conf 

– debería verse algo como esto:

    ServerAdmin [email protected]
    DocumentRoot /var/www/html
    <Directory /var/www/html/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

Si no ve algo así, pegue el código anterior dentro del host virtual

Cuando haya terminado, guarde y cierre el archivo.

A continuación, debemos habilitar el módulo de reescritura, que le permite modificar las URL. Puedes hacer esto escribiendo:

sudo a2enmod rewrite

Después de realizar estos cambios, reinicie Apache:

sudo service apache2 restart

avatar de usuario
Rangel Morais

Esto puede ayudarte a resolver esto:

sudo chown -R www-data:www-data /var/www

avatar de usuario
Extraño

Después de pasar mucho tiempo, esto es lo que funcionó con éxito en el servidor LAMP de mi máquina Linux. Se necesitan los siguientes cambios para que funcione perfectamente,

  1. Agrega esto a tu /etc/hosts expediente.

    127.0.0.1   sitename.com
    
  2. Agregue la entrada de host de la siguiente manera en la ruta /etc/apache2/sites-available/sitename.com.conf

    <VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName sitename.com
    
        DocumentRoot /var/www/sitename.com/public_html
        <Directory />
            Options FollowSymLinks
            AllowOverride None
        </Directory>
        <Directory /var/www/sitename.com/public_html>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    
  3. Crear enlace simbólico a sitios habilitados.

    sudo ln -s /etc/apache2/sites-available/sitename.com.conf /etc/apache2/sites-enabled/sitename.com.conf
    
  4. Reinicie apache usando el comando,

    sudo service apache2 restart
    

Esto funciona perfectamente para mi. Instrucciones para agregar una entrada de host tomadas de, https://www.digitalocean.com/community/questions/wordpress-permalinks-not-working-on-ubuntu-14-04

¿Ha sido útil esta solución?