Ir al contenido

Los visitantes pasan por varias redirecciones antes de la página

Aviso Todo el dominio Seguridad

Instrucciones generales. Abra este artículo desde su informe de PageCheck para verlo completado con las cadenas de redirecciones encontradas en su sitio y la regla para su alojamiento (Cloudflare, Plesk, cPanel, Apache o nginx).

Qué es

Un sitio web tiene cuatro direcciones raíz: con y sin www, por http:// y por https://. Los visitantes escriben cualquiera de ellas, y los enlaces antiguos y los resultados de búsqueda apuntan a cualquiera de ellas. Solo una sirve la página; las otras tres deberían enviar al visitante allí con una sola redirección permanente (301), directamente a la dirección https:// y nunca pasando por http://.

Cada redirección adicional es un viaje completo de ida y vuelta al servidor antes de que la página pueda siquiera empezar a cargar, y Google pide que no haya más de una. Un salto de https:// a http:// pone a quien visita el sitio por primera vez en una conexión sin cifrar que cualquiera en la misma red puede leer o desviar.

Qué falla

Una o más de las direcciones raíz necesitan dos o más redirecciones para llegar a la página, pasan por http:// sin cifrar por el camino, usan una redirección temporal, terminan en otro sitio web o nunca llegan a una página.

Cómo arreglarlo

1. Decida la única dirección final y asegúrese de que HTTPS funciona en todos los nombres. La página se sirve en https://example.com, así que esa es la dirección a la que deben apuntar todas las demás. Antes de añadir ninguna redirección, abra https:// en el otro nombre (www.example.com) en un navegador: no debe mostrar ninguna advertencia de certificado. Los certificados de Let's Encrypt y de Cloudflare cubren ambos nombres cuando ambos están incluidos; si falta uno, añádalo primero al certificado, o cada redirección desde ese nombre empezará con una advertencia.

2. Configure una sola redirección permanente desde cada una de las otras direcciones raíz directamente a la final. Use la regla para el lugar donde responde su sitio (su proveedor puede decírselo): una regla que trate el esquema y el www en el mismo paso, no dos reglas una tras otra. Use un 301, nunca un 302 ni un 307, y conserve la ruta y la cadena de consulta.

Apache o LiteSpeed (también alojamientos Plesk y cPanel con Apache): en el archivo .htaccess de la carpeta principal del sitio, encima de la línea «# BEGIN WordPress»

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]

nginx: los bloques server del sitio

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;
    # the certificate must cover www.example.com
    return 301 https://example.com$request_uri;
}

Cloudflare, si el sitio está detrás de él: Rules → Redirect Rules → Create rule

When incoming requests match (custom filter expression):
    http.host eq "www.example.com"

Then: Dynamic redirect, status code 301, preserve query string:
    concat("https://example.com", http.request.uri.path)
  • Plesk: Websites & Domains → Hosting Settings: ponga «Preferred domain» en la forma que eligió (https://example.com) y marque «Permanent SEO-safe 301 redirect from HTTP to HTTPS». Plesk envía entonces cada una de las otras direcciones raíz a la final en un solo paso.
  • cPanel: Domains → Redirects: una redirección permanente (301) con comodín desde el otro nombre a la dirección final, «Redirect with or without www», o la regla de .htaccess de arriba.
  • Si una CDN o un balanceador de carga termina el HTTPS delante del servidor, el servidor ve http:// sin cifrar y la regla de .htaccess de arriba entra en bucle. Compruebe la cabecera «X-Forwarded-Proto» en lugar de %{HTTPS}, o configure la redirección en la CDN como con Cloudflare.
  • Elimine después cualquier otra regla de redirección para estas direcciones (un plugin antiguo de «forzar HTTPS», una segunda redirección del panel de control): son dos reglas las que producen dos saltos.

3. Indique a los navegadores que usen https:// desde el principio. Cuando https:// funcione en ambos nombres, envíe la cabecera Strict-Transport-Security: max-age=31536000; includeSubDomains en los dos. Un navegador que haya visitado el sitio una vez no vuelve a probar http://, así que el salto por http:// desaparece para los visitantes que regresan. Añada «preload» y envíe el dominio a hstspreload.org solo cuando todos los subdominios funcionen por HTTPS.

4. Compruébalo. Pida a cada dirección raíz su primera respuesta: todas salvo la dirección final deben responder 301 con la dirección final en «location», y la dirección final debe responder 200:

En un terminal

curl -sI http://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI https://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI http://example.com/ | grep -i '^HTTP\|^location'
curl -sI https://example.com/ | grep -i '^HTTP\|^location'

Después vuelva a ejecutar esta comprobación: sigue las cuatro direcciones y enumera cada salto.

Make every root address of my website reach the page in one permanent redirect: http://www.example.com/, https://www.example.com/ and http://example.com/ must each answer 301 straight to https://example.com (same path and query), never via http:// on the way, and https://example.com/ must answer 200.
The site is not known to be behind a CDN.

Steps:
1. Make sure the certificate covers example.com and www.example.com (no warning on https:// for either name).
2. Replace all existing redirect rules for these addresses with ONE rule that handles scheme and host in the same step: on Cloudflare a Single Redirect `http.host eq "www.example.com"` → `concat("https://example.com", http.request.uri.path)` (301, preserve query string) with Always Use HTTPS left on; on Apache/LiteSpeed a RewriteCond %{HTTPS} off [OR] / RewriteCond %{HTTP_HOST} ^www\.example\.com$ / RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] block above # BEGIN WordPress; on nginx a port-80 server block for both names and a port-443 block for www.example.com, each `return 301 https://example.com$request_uri;`. Behind a TLS-terminating proxy test X-Forwarded-Proto, not %{HTTPS}.
3. Remove the other rules (control panel redirects, force-HTTPS / force-www plugins) so no address takes two hops.
4. Send `Strict-Transport-Security: max-age=31536000; includeSubDomains` on both names once https:// works on both.
5. Verify with curl -sI on all four root addresses: three answer 301 with location https://example.com/… in one hop, the final one 200; show me the output.
Tell me exactly which files or settings you changed.

Resources:
- Google Search Central, redirects and Google Search: https://developers.google.com/search/docs/crawling-indexing/301-redirects
- Cloudflare, Single Redirects: https://developers.cloudflare.com/rules/url-forwarding/single-redirects/

Revisa tu sitio para ver si tiene este problema. Revisar un sitio web