Como configurar URLs amigables en WordPress

wordpress
Recientemente he instalado WordPress pero las URLs se generan con el siguiente formato:

https://www.midominio.com/?p=123

P. ¿Qué debo hacer para que las URLs sean amigables?

R. Las URLs amigables es una característica SEO que permite que los búscadores indexen mejor tu sitio y a la vez los usuarios asocien la localización del recurso con el contenido. WordPress permite configurar 6 tipos de URLs, para ello vamos a:

Administración > Ajustes > Enlaces permanentes

y obtenemos las siguientes opciones de configuración.

El modo simple es el modo por defecto y se corresponde con el formato de URL mencionado en la pregunta.

Los demás formatos funcionan de manera similar por lo que solo explicaremos el formato de «Estructura personalizada», el valor /%category%/%postname%/ significa que el formato de URL sería:

https://www.midominio.com/categoría/post-de-ejemplo/

Una URL de ejemplo sería:

https://www.librebyte.net/cms/como-configurar-urls-amigables-en-wordpress/

Una vez que guardamos los cambios debemos comprobar que el módulo mod_rewrite ha sido cargado por el Apache si usas una distribución como Fedora, CentOS o RHEL puedes ejecutar los siguientes comandos:

$ grep rewrite -R /etc/httpd/conf.modules.d/
/etc/httpd/conf.modules.d/00-base.conf:LoadModule rewrite_module modules/mod_rewrite.so

Para cualquier distribución puedes ejecutar

$ apachectl -M| grep -i rewrite
rewrite_module (shared)

Aségure de tener un fichero .htaccess en el directorio raíz de su proyecto similar a:

# BEGIN WordPress
# If you uncomment IfModule directive you must set AllowOverride All
# 
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# 
# END WordPress

De manera general los proveedores de Hosting permiten .htaccess, si Ud. instaló y configuró WordPress en un Servidor Dedicado o en un VPS entonces busque en la configuración del servidor web (/etc/httpd/conf/httpd.conf para CentOS/Fedora/RHEL, /etc/apache2/apache2.conf para Debian/Ubuntu) la directiva Directory que está apuntando al directorio raíz de su proyecto, asegúrese que en la sección enmarcada por la directiva Directory las directivas AllowOverride, AllowOverrideList tiene la siguientes configuraciones:

AllowOverride: Debe establecerse el valor a All o incluir el valor FileInfo, ejemplo:

AllowOverride FileInfo Limit

Si el valor de la directiva AllowOverride es None entonces la directiva AllowOverrideList debe tener la siguiente configuración

AllowOverrideList RewriteEngine RewriteOptions RewriteBase RewriteCond RewriteRule

Si le realizó algún cambio a la directivas anteriores entonces debe reiniciar el Apache

$ sudo systemctl restart httpd (Fedora/CentOS/RHEL)
$sudo systemctl restart apache2 (Debian/Ubuntu)

Para NGINX use una configuración similar a:

# Upstream to abstract backend connection(s) for PHP
# php-fpm is the docker container name where the php-fpm service is running. 
# The NGINX server is running inside a docker container too and it's linked to
# php-fpm docker container.
upstream fpm {
    server php-fpm:9000;
}
    
server {
  listen 80;
  server_name www.librebyte.net;
  root /var/www/html/librebyte;
  index index.php;

  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  # Add trailing slash to Wordpress Admin Panel requests, using
  # full schema redirect due nginx is in a docker container with
  # listen port = 80 and exposed port = 8080 (8080 -> 80)
  rewrite /wp-admin$ $scheme://$http_host/wp-admin/ permanent;

  location / {
    # This is cool because no php is touched for static content.
    # include the "?$args" part so non-default permalinks doesn't break when
    # using query string
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include        fastcgi.conf;
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
}

Fichero de configuración FastCGI

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY          "";

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

# Default file will be requested
fastcgi_index                     index.php;

# Linked to fpm upstream name
fastcgi_pass                      fpm;

Lecturas recomendadas

Video asociado al artículo

YouTube video

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.