Internet se está moviendo hacia el uso universal de conexiones seguras a pasos agigantados. Por ejemplo, Google ya lo toma como criterio de posicionamiento en su buscador y prefiere indexar URLs en versión HTTPS, Mozilla ha propuesto depreciar el protocolo HTTP no seguro para un posible abandono en el futuro, los principales navegadores han anunciado que soportarán la nueva versión HTTP/2 solo bajo conexiones seguras y agencias como el W3C o el IETF han hecho un llamamiento para el uso universal de comunicaciones encriptadas, llamamiento al que se han unido algunos gobiernos, entre ellos el de Estados Unidos.

Así que el uso de HTTPS (Hypertext Transfer Protocol Secure) será obligatorio en un futuro no muy lejano para cualquier comunicación en Internet. Toca migrar nuestras webs. En este tutorial aprenderemos como pasar nuestra web montada en WordPress desde HTTP a HTTPS en unos pasos sencillos y que aseguran que todo seguirá funcionando perfectamente.

1

Adquirir e instalar un certificado SSL

¿Había dicho dos pasos? Bueno, pues en realidad son tres, pero este primer paso es igual para cualquier web y no hay nada específico de WordPress involucrado.

Para que un navegador acepte una conexión segura con un servidor, el servidor ha de enviarle primero un certificado SSL (Secure Sockets Layer), el navegador comprueba que es válido y sólo entonces comenzará la comunicación encriptada.

Existen certificados gratuitos, de pago, baratos, caros, con diferentes niveles de validación, con seguros en caso de que la información se vea comprometida o sin seguro, y un largo etcétera. En función de estas características el precio puede variar muchísimo.

Generalmente el certificado consta de dos claves encriptadas. Una es el certificado en sí mismo y la otra es la firma del emisor del certificado. Las dos claves son necesarias para instalar el certificado correctamente. Los pasos para hacerlo pueden variar mucho de un servidor a otro pero la verdad es que casi todos los paneles de administración lo ponen fácil.

Por ejemplo, en cPanel busca el apartado “Seguridad → Administrador de SSL/TLS” y luego “Administrar los sitios SSL”. Sigue las instrucciones que aparecen en pantalla, son muy sencillas, pero si te ves con dudas lo mejor es que contactes con el soporte de tu proveedor de hosting para que te ayude.

Una vez que tengas el certificado SSL instalado, ve al paso número 2.

2

Search & Replace en la base de datos

WordPress guarda la URL del sitio en la base de datos desde la configuración (Ajustes → Generales); podrías cambiar esta configuración e introducir la versión HTTPS de tu dominio y ya está, como dicen muchos tutoriales, pero hay un gran problema: quedarán muchísimas referencias a la versión HTTP por toda la base de datos. Por ejemplo, la URL de imágenes insertadas en los posts.

Por eso no es suficiente con cambiar la configuración.

El problema se podría solucionar con diferentes enfoques, para mí uno de los más directos es hacer un “buscar y reemplazar” en toda la base de datos. Buscamos las referencias a la versión en HTTP (http://miweb.com) y la reemplazamos por la versión HTTPS (https://miweb.com).

Y como WordPress tiene la costumbre de guardar datos serializados en la base de datos, y también lo hacen muchos plugins, has de hacer un search&replace que mantenga la validez de esos datos serializados. Existen muchas herramientas que hacen este trabajo muy bien, entre ellas Database search and replace for WordPress es una de las más populares. Sigue las instrucciones de uso que aparecen en su página, son bastante sencillas:

Search & replace DB
Search & replace DB

También puedes utilizar alguno de los muchos plugins disponibles, como Velvet Blues Update URLs o Better Search Replace. Y si utilizas wp-cli, puedes utilizar el siguiente comando:

wp search-replace 'http://ejemplo.com' 'https://ejemplo.com'
3

Redirigir todo el tráfico a HTTPS

Para terminar la migración, tenemos que redirigir todo el tráfico que nos llegue en la versión HTTP a la nueva URL. Con la estas reglas en .htaccess, colocadas antes de las reglas de WordPress, haremos una redirección 301, con lo que redirigimos a los usuarios a la vez que pasamos todas las señales SEO a la nueva ubicación:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]

En realidad, una vez que la configuración de WordPress tiene la URL en la versión HTTPS, el propio WordPress puede hacer la redirección, pero esto supone cargar WordPress, redirigir al usuario y volver a cargar WordPress. Haciendo la redirección desde .htaccess, o desde la configuración del servidor, no se llega a ejecutar ni una sola línea de PHP y es mucho más eficiente.

Y ya está. Ya tienes tu WordPress servido completamente a través de HTTPS. Y si necesitas volver a HTTP (¿por qué harías algo así?), haces de nuevo el Search & Replace a la inversa y listo.

4

Forzar HTTPS SSL en instalaciones nuevas

Hemos visto como migrar una web que ya estaba funcionando en HTTP y pasarla a HTTPS. En el caso de que estés realizando una instalación de WordPress nueva, forzar HTTPS es tan fácil como instalar el certificado SSL en el servidor y hacer la instalación directamente sobre la URL en versión HTTPS, por ejemplo https://ejemplo.com/wp-admin/install.php.

Aunque no es necesario nada más, puedes añadir la redirección 301 que comentábamos antes en .htaccess o en la configuración del servidor./step]

Algunas consideraciones finales

Es muy frecuente ver tutoriales que hablan de meter código en wp-config.php o de utilizar algún plugin. Salvo unos pocos casos con necesidades muy concretas, nada de eso es necesario si se han seguido los pasos descritos en este tutorial.

También es frecuente que se recomiende revisar los archivos del theme y de los plugins instalados en busca de recursos cargados desde HTTP. Hazlo si ves errores de contenido mixto, pero en general tampoco debería ser necesario si el theme y los plugins han sido correctamente programados.

Otra cosa que se ve en muchos tutoriales es el forzado HTTPS sólo en la administración y login pero no en el resto del sitio. No voy a tratar esta opción ya que, como se decía en la introducción, Internet se mueve hacia el uso universal de HTTPS; utilizarlo sólo en algunas partes no es precisamente “universal”.

  • Muchas gracias por tu excelente trabajo.
    Tengo un par de dudas aún:

    1) Cuando se hace el cambio de protocolo de a en WordPress > Ajustes > Generales, ¿hay que Guardar cambios y luego salir de WP, o hay que salir de WP directamente para poder acceder de nuevo al panel de administración de WP con normalidad?

    2) Al modificar el archivo .htaccess las nuevas reglas
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]
    hay que situarlas:
    A) antes de # BEGIN WordPress
    B) Entre # BEGIN WordPress y
    C) Inmediatamente a continuación de

    Un saludo cordial,

    • Hola Gaspar.

      Para la pregunta 1, si haces el “buscar y reemplazar” en la base de datos, también se cambian las opciones de configuración, así que no hay necesidad de cambiar esos ajustes manualmente.

      No sé exactamente a que te refieres con entrar a la administración de WordPress “con normalidad”. Pero tras el cambio tendrás que iniciar sesión en WordPress de nuevo.

      WordPress utiliza una cookie para recordar al usuario. Si habías accedido a través de la versión HTTP, esa cookie no será válida para la versión HTTPS, así que tendrás que iniciar sesión en WordPress de nuevo.

      Es completamente normal. No hay ningún error en eso.

    • Buenos días, Juan.

      He utilizado, desde el protocolo http://…, el plugin Search & Replace (https://es.wordpress.org/plugins/search-and-replace/) para exportar una nueva base de datos + un cambio de URL a mi disco.

      Supongo que debo importarla desde dentro del plugin, luego guardar y salir de WP Admin sin cambiar manualmente las URL en Ajustes > Generales.

      Cuando vuelva a entrar en WP Admin me pedirá identificarme de nuevo, con los mismos datos anteriores y entraré ya con protocolo HTTPS

      ¿Correcto?

      En cuanto a la pregunta 2) sobre la escritura de .htaccess puedes aclararme una respuesta sobre las tres opciones que te planteaba.

      Gracias de antemano por tu ayuda

    • En general, antes de # BEGIN WordPress.

    • Gracias de nuevo, Juan.
      ¡Vamos a ello!

  • Nestor Fontalvo

    Hola Juan. Gracias por tus artículos bien escritos. Son de mucha ayuda.

    Pregunta: Tengo una pagina en Ipage pero no veo en el administrador el Cpanel. Que deberia hacer entonces?

    • Hola Nestor,

      Cómo decía en el post, el proceso de instalación de un certificado puede variar mucho de un servidor a otro dependiendo del software que utilice. Lamentablemente no puedo cubrirlos todos, cPanel lo nombré solo como ejemplo por ser uno de los paneles de control más comunes. Ni de idea de que utiliza Ipage, mejor que contactes con ellos.

  • Adri

    Buenas Juan,

    Me gustaría hacerte la siguiente consulta: Después de la migración y de corregir posibles enlaces rotos etc… sería bueno eliminar las urls (antiguas) http; o las nuevas urls en https irán canibalizando en buscadores a las primeras?

    Una cosilla más, una vez das de alta las distintas propiedades en Search Console e indicas tu preferencia de dominio, envías sitemap …. debo eliminar el resto de propiedades?

    Espero haberme explicado bien 🙂

    Muchas gracias!

    • Hola Adri,

      ¿Eliminar de dónde? Si has hecho una redirección 301 de HTTP a HTTPS no tienes que hacer nada respecto a los buscadores (Google, Bing, Yahoo y demás). La redirección 301 es precisamente para eso, para indicar un cambio permanente de dirección. Buscadores y crawlers en general serán redirigidos con esa indicación e irán actualizando su índice.

      Respecto a Search Console, si estás seguro de que una propiedad no la vas a necesitar nunca más, la podrías eliminar. Pero eso es ya cosa tuya 😉

      Saludos!!

    • Adri

      Hola Juan,

      Gracias por la respuesta!, mi temor era ver las dos versiones conviviendo en los buscadores y tener algún problema de contenido duplicado. Pero entiendo que con la calma irán desindexando las urls antiguas.

      No se 100% si no voy a necesitar esas propiedades en el futuro, de modo que no hay problema en dejarlas ahí no?

      Una ultima, debería figurar el mismo sitemap en todas las propiedasdes o sólo en la nueva versión en https?

      Saludos!

  • Don Pulgarsito de la santisima

    GRACIAAASSSSSSSSSSSSS

  • Fabián

    muchas gracias!!

  • Miguel

    1.- Tengo 3 wordpress bajo el mismo dominio. Cada uno de ellos en una carpeta distinta. Además, hay parte de la web en html.
    2.- Hoy he migrado los tres a https sin problemas.
    3.- En el htaccess del directorio raíz del dominio he añadido lo siguiente:
    `RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]`

    El resultado ha sido:
    1.- Parte HTML: correcto.
    2.- De los tres wordpress, solo uno redirecciona. los otros dos no.

    He tenido que editar el htacces de cada uno de los dos que no redireccionan automáticamente y añadir las mismas líneas para que funcionaran.

    ¿Podría decirme a que se debe? ¿por qué uno redirecciona automáticamente y los otros dos no? La única diferencia entre ellos es que las dos instalaciones más antiguas son las que no redireccionan.

    Un saludo.

    • No estoy seguro, no soy experto en servidores, pero yo diría que es lo normal. Cada dominio se verá afectado por el .htaccess de su directorio raíz.

    • Miguel

      Te planteo la pregunta de otro modo. Según indicas, “WordPress puede redireccionar de forma automática las solicitudes HTTP a HTTPS”.
      Sin nada en el htaccess, ¿por qué uno redirecciona y los otros dos no?
      Un saludo

      Nota: no son tres dominios distintos sino un solo dominio con tres wordpress en tres carpetas distintas.

    • Ah, Ok, creo que ahora lo he entiendo perfectamente. Pero no sabría decirte, así a ciegas sin mirar el sitio no se me ocurre nada. o mejor dicho, se me ocurren muchas posibilidades.

    • Acabo de ver que aquí mismo me pasaba por un problema de caché. Si se entraba por http://, se cacheaba esa versión y luego eras redirigido a https://. Si se volvía a entrar por http:// se servía la versión cacheada sin ser redirigido. Ya lo he solucionado.

    • Miguel

      Yo no uso plugin de cache porque tengo instalado OPCache en el servidor y funciona en modo automático.
      Y en todo caso, solo me pasa en dos. En uno hace la redirección bien. Esto indica que no es cuestión de cache.
      Acabo de revisar los campos y sus valores de la tabla wp_options y me he encontrado con lo siguiente:
      1.- En los dos wordpress que no redireccionan de forma automática hay un campo llamado “use_ssl” con el valor “0” (cero).
      2.- En el wordpress que redirecciona no existe tal campo.
      ¿Puede tener algo que ver?

      NOTA: No he probado a cambiar el valor por si estropeaba algo.

    • Bueno, yo me refería a la caché estática, que precisamente ahora la tengo a nivel de servidor, no en WordPress directamente. OPCache es otra cosa, ambos tipos de caché son complementarios y no excluyentes.

      Yo utilizo las dos.

      Ten en cuenta que OPCache compila PHP pero las páginas todavía tienen que generarse de forma dinámica, y ahí entra la caché estática, que cachea las páginas para que se sirvan como si fueran archivos estáticos sin que tenga que trabajar PHP.

      OPCache te viene bien, por ejemplo, durante el trabajo en wp-admin o durante la primera visita a alguna página de tu web, ya que PHP será más rápido al estar compilado y cacheado. Tras esta primera visita, la página se queda en la caché estática y las siguientes visitas la reciben directamente sin que intervenga PHP para nada, lo que es mucho más rápido.

      Por eso los dos tipos de caché son complementarios.

      Nunca he visto ese campo de use_ssl pero me suena, voy a mirar un poco, un momento.

    • No sabría que decirte, yo quitaría esa entrada de la tabla. use_ssl = 0 es igual que “no utilizar SSL” (el 0 es igual a false), o ponerla en use_ssl = 1. También aparece como opción de usuario individual, se puede ver en wp_insert_user() y use_ssl_preference().

    • Miguel

      Opción use_ssl: probaré a ponerla en “1” y a quitarla. ya te diré.
      En cuanto al cache: usaba antes W3 Total cache pero ya no puedo. Por cuestiones de configuración del servidor no me deja seleccionar ningún método de cache. Preguntaré al soporte a ver qué me dicen.
      En cuanto tenga algo, te lo digo.

    • Todos los hostings que he visto que no permiten el uso de W3TC, WP Super Caché y similares es porque cuentan con su propio sistema de page cache a nivel de servidor, pregúntales.

      Ya me cuentas que tal va lo de la opción use_ssl.

      Saludos!

    • Miguel

      Al final, y visto que era muy complicado averiguar el porqué, he decidido activar le plugin WP Force SSL.
      Gracias por tu atención.

    • Como lo soluicionaste?

    • En mi caso era un tema de .htaccess y el plugin LiteSpeed Cache. Puse la redirección de HTTP a HTTPS antes de las reglas que controlan la caché y listo.

  • Perfecto! Juan, muchas gracias!

  • Antonio

    Hola Juan, magnífico post. Tengo unas cuantas de dudas. Estoy construyendo mi página que aún no lancé pero cometí un fallo por lo que veo. Instalé WordPress antes de que mi compañía de host me diera el certificado SSL por lo tanto instalé todo sobre http. Ahora al querer migrar estoy teniendo muchos problemas con el tema y el hosting. Unos me remiten a un problema y otros a otro por lo que después de leer tu post he pensado que como aún no publiqué la página y estoy retocando los últimos detalles, quizás sea más fácil y conveniente que vuelva a instalar una versión limpia de wordpress y subir todo el contenido de nuevo para evitar estor problemas. Lo que no sé es donde habría que indicar la versión url con el https en la instalación ni si con “por los mismos motivos de eficiencia que se describían en el punto 3, puedes añadir la redirección 301 en .htaccess.” te refieres a usar las dos frases de código que proporcionas en el paso tres o una variación. Gracias.

    • Antonio

      ¿Quizás no haya que introducir esa url sino llamar al archivo de instalación desde la url https://midominio.com? En mi caso mi dominio es sin las www. pero puedes entrar desde ambas, según mi compañía de hosting esto es lo que estaría causando el problema de la migración también.

    • Efectivamente, tienes toda la razón, para instalaciones nuevas basta hacer la instalación directamente utilizando HTTPS, por ejemplo https://ejemplo.com/wp-admin/install.php.

      Muchísimas gracias por avisar!!!

    • Antonio

      ¿Y ya quedaría todo instalado sobre HTTPS? Creo que voy a hacer una instalación limpia si es así porque estoy teniendo muchos problemas con la instalación. Gracias por la respuesta.

    • Antonio

      Hice una instalación limpia y ahora si está todo correcto aunque no había manera de que por defecto forzara la url https.

  • Miguel

    Una consulta respecto al apartado “Redirigir todo el tráfico a HTTPS”: ¿es tal cual el código o hay alguna variable que haya que cambiar según sea el nombre de nuestro sitio?

    • Hola Miguel,

      El código tal cual debería funcionar en cualquier sitio, en cualquier servidor Apache.

    • Miguel

      Gracias, Juan. De todas formas, abriré un tema en el soporte de wordpress con algunas dudas y haciendo referencia a este post. Nos vemos allí (soy almendron).

  • Carlos

    muchas gracias por el tutorial me ha ayudado mucho, funciona perfecto, tengo una consulta, yo tengo integrado google analytics, tendría que cambiar a mi analytics por defecto a https?, a espera de su respuesta, saludos.

    • Uff, hace mucho que no hago una migración pero si la memoria no me falla, no hay nada que hacer en analytics pero en Search Console sí (antiguo Wemaster Tools).

  • Hola Juan, muy bueno el post.
    Cuando comentas “colócalo antes de las reglas de WordPress” a que te refieres. Te lo pregunto por que tengo un problema con una web que le he instaldo el certificado y he hecho los cambios en wordpres pero no consigo hacer la redirección. He probado con el .htaccess pero por lo que se ve lo hago mal, cero que no pongo el código donde corresponde.
    Gracias

    • Buenas noches!!

      Si he entendido bien, el problema que tienes es que no consigues redireccionar todo el tráfico desde HTTP a HTTPS. ¿Estoy en lo cierto?

      En el archivo .htaccess predeterminado de WordPress hay un bloque que comienza así:

      # BEGIN WordPress

      Esa línea marca el comienzo de las reglas de reescritura de WordPress y la redirección hay que hacerla antes de esa línea.

    • Hola, efectivamente era eso. El tema es que lo estaba haciendo mal,
      colocaba el código al final del htaccess y me daba erro. Ahora ya me
      funciona.
      Muchas gracias!!