WordPress configurar Apache o Nginx en multisitio

Para aquellos que deban montar un WordPress con multisitio voy a dejar un rápido tutorial para activar y configurarlo en los 2 servidores web más famosos: Apache y Nginx. Mi intención no es profundizar en las particularidades o sus posibilidades, sino hacerlo funcionar correctamente. Conozco de primera mano el dolor de cabeza que supone construirlo en un VPS (o servidor dedicado) o un hosting de pago poco amable.

En caso de indicar que diferencie los sitios por medio de los subdominios, no será necesario modificar nada.

Activar multisitio en WordPress

En wp-config.php añadimos.

define( 'WP_ALLOW_MULTISITE', true );

Después, si acudes a Herramientas > Configuración de la red te pedirá que también añadas lo siguiente.

define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'dominio.com);
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

Recuerda cambiar dominio.com por el tuyo.

Configuración Apache

En .htaccess, que lo encontrarás en la raíz de WordPress, debes modificarlo con el siguiente contenido.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>

# END WordPress

Configuración Nginx

En el archivo donde configuras el sitio, situado posiblemente en /etc/nginx/site-enabled/dominio.com, le indicaremos que funcione con el sistema de permalinks (enlaces permanentes) de WordPress.

location / {
	try_files $uri uri//index.php?q=uri&$ar
}

A continuación que vamos a utilizar un sistema de carpetas, o subdirectorios, para el multisitio.

if (!-e $request_filename) {
      rewrite /wp-admin$ $scheme://$host$uri/ permanent;
      rewrite ^(?!^/my-db-admin)(/[^/]+)?(/wp-.*) $2 last;
      rewrite ^(?!^/my-db-admin)(/[^/]+)?(/.*\.php) $2 last;
}

Quedando todo unido de la siguiente manera. No olvides modificar root y server_name.

server {

    listen 80;

    index index.php;

    server_name dominio.com;
    
    root /localizacion/carpeta/wordpress;


    location / {
	    try_files $uri uri//index.php?q=uri&$ar
    }

    if (!-e $request_filename) {
          rewrite /wp-admin$ $scheme://$host$uri/ permanent;
          rewrite ^(?!^/my-db-admin)(/[^/]+)?(/wp-.*) $2 last;
          rewrite ^(?!^/my-db-admin)(/[^/]+)?(/.*\.php) $2 last;
    }
}
Versión escritorio