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;