<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Erick Eduardo Ramos</title>
    <description>The latest articles on DEV Community by Erick Eduardo Ramos (@erickeduardoramos03).</description>
    <link>https://dev.to/erickeduardoramos03</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943545%2Ff8b96fcc-b7e6-4c21-a809-3c6ffedaea58.png</url>
      <title>DEV Community: Erick Eduardo Ramos</title>
      <link>https://dev.to/erickeduardoramos03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erickeduardoramos03"/>
    <language>en</language>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Mon, 12 Oct 2026 18:27:49 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-5c2e</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-5c2e</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sun, 11 Oct 2026 15:14:26 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-kp4</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-kp4</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sat, 10 Oct 2026 14:57:14 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-3mb2</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-3mb2</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 09 Oct 2026 15:42:41 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-19p9</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-19p9</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Thu, 08 Oct 2026 16:00:35 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-lh4</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-lh4</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Error al generar contenido</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Wed, 07 Oct 2026 15:58:18 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/error-al-generar-contenido-1b6j</link>
      <guid>https://dev.to/erickeduardoramos03/error-al-generar-contenido-1b6j</guid>
      <description>&lt;h1&gt;
  
  
  Error al generar contenido
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Por favor, revisa la conexión con la API de Hugging Face.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con error `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Tue, 06 Oct 2026 15:37:34 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-error-exited-1-en-raspberry-pi-j6g</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-error-exited-1-en-raspberry-pi-j6g</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con error &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre?
&lt;/h2&gt;

&lt;p&gt;El código de salida &lt;code&gt;1&lt;/code&gt; indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura incompatible&lt;/strong&gt;: La imagen fue construida para &lt;code&gt;amd64&lt;/code&gt; (x86_64), pero Raspberry Pi usa &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de binarios compatibles&lt;/strong&gt;: El &lt;code&gt;ENTRYPOINT&lt;/code&gt; o &lt;code&gt;CMD&lt;/code&gt; del contenedor intenta ejecutar un binario compilado para otra arquitectura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas de permisos o recursos&lt;/strong&gt; en entornos embebidos como Raspberry Pi (ej. falta de &lt;code&gt;--privileged&lt;/code&gt;, cgroups limitados, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso incorrecto de flags&lt;/strong&gt;: En tu comando hay un error de sintaxis: &lt;code&gt;--net = host&lt;/code&gt; (espacios alrededor del &lt;code&gt;=&lt;/code&gt;), lo cual puede causar fallos silenciosos o interpretaciones erróneas.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Nota crítica&lt;/strong&gt;: En Raspberry Pi, Docker por defecto usa &lt;code&gt;arm32v7&lt;/code&gt; (aunque hay variantes &lt;code&gt;arm64v8&lt;/code&gt; en Pi 3/4 64-bit), y &lt;strong&gt;no todos los repositorios de Docker Hub ofrecen imágenes multi-arquitectura&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo (ordenados por prioridad)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Corrige la sintaxis del comando (¡es el error más común!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ INCORRECTO (espacios alrededor del '=')&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage

&lt;span class="c"&gt;# ✅ CORRECTO (sin espacios)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;El espacio tras &lt;code&gt;--net&lt;/code&gt; hace que Docker interprete &lt;code&gt;=&lt;/code&gt; como un argumento adicional, y &lt;code&gt;host&lt;/code&gt; como el nombre de la imagen → &lt;strong&gt;falla al encontrar la imagen&lt;/strong&gt; y termina con código 1.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Verifica la arquitectura de la imagen
&lt;/h3&gt;

&lt;p&gt;Ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si devuelve &lt;code&gt;amd64&lt;/code&gt; → &lt;strong&gt;no es compatible con Raspberry Pi&lt;/strong&gt; (a menos que uses QEMU emulación).&lt;/li&gt;
&lt;li&gt;En Raspberry Pi 3/4 con sistema 64-bit (Raspberry Pi OS 64-bit), espera &lt;code&gt;arm64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;En Raspberry Pi 2/3 con sistema 32-bit, espera &lt;code&gt;arm&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Usa imágenes multi-arquitectura o construye para ARM
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Opción A: Busca imágenes con soporte explícito para ARM
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ejemplo: imagen oficial de nginx con soporte multi-arch&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 arm32v7/nginx:latest
&lt;span class="c"&gt;# o para Pi 4 64-bit:&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 arm64v8/nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción B: Construye la imagen localmente en la Pi
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clona el repo o copia el Dockerfile&lt;/span&gt;
git clone https://github.com/tu-usuario/tu-repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;tu-repo

&lt;span class="c"&gt;# Construye para ARM (sin especificar arquitectura, usa la nativa)&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción C: Usa &lt;code&gt;buildx&lt;/code&gt; para construir multi-arch (avanzado)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt;
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--load&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Ejecuta en primer plano para depurar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Elimina -d para ver logs en tiempo real&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Si el contenedor falla al iniciar, verás el mensaje de error directamente (ej. &lt;code&gt;exec format error&lt;/code&gt;, &lt;code&gt;segmentation fault&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Bloque de código corregido (ejemplo funcional)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Verifica arquitectura&lt;/span&gt;
docker info &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Server.Architecture}}'&lt;/span&gt;

&lt;span class="c"&gt;# 2. Corrige el comando (¡sin espacios en --net!)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage

&lt;span class="c"&gt;# 3. Si persiste el error, revisa logs:&lt;/span&gt;
docker logs &amp;lt;container_id&amp;gt;
&lt;span class="c"&gt;# o ejecuta en foreground:&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Diagnóstico rápido en Raspberry Pi
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica si el binario del contenedor es compatible&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; /bin/sh myimage &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"file /bin/sh"&lt;/span&gt;
&lt;span class="c"&gt;# Debería mostrar algo como: "ELF 32-bit LSB executable, ARM"&lt;/span&gt;

&lt;span class="c"&gt;# Si ves "ELF 64-bit LSB executable, x86-64" → incompatible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔧 &lt;strong&gt;Consejo extra&lt;/strong&gt;: En Raspberry Pi OS Lite (sin GUI), asegúrate de tener &lt;code&gt;docker.io&lt;/code&gt; actualizado (&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade docker.io&lt;/code&gt;). Las versiones antiguas de Docker tienen problemas conocidos con cgroups v2 y ARM.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ &lt;strong&gt;Resultado esperado&lt;/strong&gt;: El contenedor se ejecuta sin salir inmediatamente (&lt;code&gt;docker ps&lt;/code&gt; muestra estado &lt;code&gt;Up X seconds&lt;/code&gt;).&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>docker</category>
      <category>linux</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>Cómo solucionar \"Text content does not match server-rendered HTML\" en Next.js App Router</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Mon, 05 Oct 2026 17:40:59 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-text-content-does-not-match-server-rendered-html-en-nextjs-app-router-5em6</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-text-content-does-not-match-server-rendered-html-en-nextjs-app-router-5em6</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar "Text content does not match server-rendered HTML" en Next.js App Router
&lt;/h1&gt;

&lt;p&gt;Este error ocurre cuando el HTML generado en el servidor no coincide con lo que React genera en el navegador durante la hidratación. Es un problema crítico que rompe la experiencia de usuario y puede afectar el SEO.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz
&lt;/h2&gt;

&lt;p&gt;La causa más frecuente en aplicaciones modernas es el uso de APIs del navegador (&lt;code&gt;window&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;, &lt;code&gt;Date.now()&lt;/code&gt;, etc.) o lógica condicional basada en &lt;code&gt;typeof window !== 'undefined'&lt;/code&gt; &lt;strong&gt;dentro del renderizado inicial&lt;/strong&gt;. Esto provoca que el servidor renderice una versión, y el cliente otra.&lt;/p&gt;

&lt;p&gt;En tu caso, el error está relacionado con contenido dinámico (probablemente una versión, timestamp o detección de dispositivo) que cambia entre SSR y CSR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solución definitiva (3 pasos)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Aisla el código no SSR-safe
&lt;/h3&gt;

&lt;p&gt;Busca en tu layout o componentes globales (especialmente en &lt;code&gt;app/layout.tsx&lt;/code&gt;, &lt;code&gt;app/page.tsx&lt;/code&gt; o componentes de menú) cualquier uso de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;new Date()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;localStorage.getItem()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;window.innerWidth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;navigator.userAgent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Math.random()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;typeof window !== 'undefined'&lt;/code&gt; en el cuerpo del componente&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Paso 2: Aplica la solución correcta según el caso
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✅ Caso A: Contenido que &lt;em&gt;debe&lt;/em&gt; ser dinámico (ej. versión, fecha actual)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx o componente global&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ClientOnlyVersion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Solo se ejecuta en el cliente&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Ejemplo: leer de localStorage o API&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;16.3.8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;fetchVersion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm opacity-70"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Latest Version &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"format-detection"&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"telephone=no, date=no, email=no, address=no"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientOnlyVersion&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ✅ Caso B: Contenido que &lt;em&gt;no puede&lt;/em&gt; diferir (ej. texto estático)
&lt;/h4&gt;

&lt;p&gt;Asegúrate de que &lt;strong&gt;todo&lt;/strong&gt; el contenido visible en el primer render sea idéntico en SSR y CSR. Elimina cualquier lógica condicional en el render.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Caso C: Uso de &lt;code&gt;suppressHydrationWarning&lt;/code&gt; (último recurso)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Solo si el contenido es *intencionalmente* diferente (ej. timestamp)&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt; &lt;span class="na"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;suppressHydrationWarning&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 3: Verifica configuraciones externas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare / CDN&lt;/strong&gt;: Desactiva "Auto Minify" o "Rocket Loader" temporalmente para descartar modificación del HTML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensiones del navegador&lt;/strong&gt;: Prueba en modo incógnito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS Format Detection&lt;/strong&gt;: Ya incluido en el &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; anterior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bloque de código corregido (ejemplo práctico)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./globals.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Inter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/font/google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Inter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;subsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"format-detection"&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"telephone=no, date=no, email=no, address=no"&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between px-4 py-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xl font-bold"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;MenuUsing App Router&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Solución: Componente client-only para contenido dinámico */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientOnlyVersion&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// components/ClientOnlyVersion.tsx&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ClientOnlyVersion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;16.3.8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Simulación: obtención dinámica de versión&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="nf"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Fallback seguro&lt;/span&gt;
        &lt;span class="nf"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;16.3.8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;getVersion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm opacity-70"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Latest Version &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip: Prevención definitiva
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regla de oro&lt;/strong&gt;: Todo lo que se renderice en el &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; o en componentes globales (layout, navbar, footer) &lt;strong&gt;debe ser idéntico en SSR y CSR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;next/dynamic&lt;/code&gt; con &lt;code&gt;ssr: false&lt;/code&gt; solo cuando sea estrictamente necesario.&lt;/li&gt;
&lt;li&gt;En pruebas locales, activa el modo estricto de React:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;   &lt;span class="c1"&gt;// app/layout.tsx&lt;/span&gt;
   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StrictMode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="c1"&gt;// ...&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StrictMode&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;StrictMode&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Usa la extensión &lt;a href="https://react-devtools.dev/" rel="noopener noreferrer"&gt;React DevTools&lt;/a&gt; para inspeccionar el árbol de hidratación.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Nunca uses &lt;code&gt;suppressHydrationWarning&lt;/code&gt; como solución principal&lt;/strong&gt;. Es un escape hatch para casos específicos (fechas, IDs aleatorios), no una solución general.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Cómo solucionar el error “Enable JavaScript and cookies to continue”</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:33:02 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-oh</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-oh</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error “Enable JavaScript and cookies to continue”
&lt;/h1&gt;

&lt;p&gt;Este mensaje aparece cuando &lt;strong&gt;Cloudflare&lt;/strong&gt; (u otro proxy de seguridad similar) detecta que el navegador del usuario no cumple con los requisitos mínimos para acceder al sitio: &lt;strong&gt;JavaScript deshabilitado o cookies bloqueadas&lt;/strong&gt;. Pero en entornos de desarrollo o automatización, este error suele ser causado por una falla en la configuración del cliente HTTP o del entorno de ejecución.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Causa raíz técnica
&lt;/h2&gt;

&lt;p&gt;Cloudflare implementa un &lt;em&gt;JavaScript Challenge&lt;/em&gt; como mecanismo anti-bot. Cuando un cliente (navegador, script, scraper, etc.) hace una solicitud HTTP sin ejecutar JavaScript ni mantener sesiones con cookies, Cloudflare responde con una página intermedia que &lt;strong&gt;requiere ejecutar JS para generar un token de validación&lt;/strong&gt; (&lt;code&gt;cf_clearance&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;En desarrollo, esto ocurre comúnmente por:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uso de &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt; o &lt;code&gt;axios&lt;/code&gt; sin manejar cookies ni JS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloqueo de cookies por configuración del navegador o extensión (uBlock, Privacy Badger)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solicitudes desde entornos sin motor JS (Node.js sin Puppeteer, Python sin &lt;code&gt;cloudscraper&lt;/code&gt; o &lt;code&gt;requests&lt;/code&gt; + sesiones)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirecciones mal manejadas tras el desafío JS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Solución definitiva (por escenario)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧪 Caso 1: Automatización (Python, Node.js, etc.)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✅ Solución con &lt;code&gt;cloudscraper&lt;/code&gt; (Python)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudscraper&lt;/span&gt;

&lt;span class="n"&gt;scraper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudscraper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_scraper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;firefox&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mobile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tu-sitio.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scraper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: &lt;code&gt;cloudscraper&lt;/code&gt; resuelve el desafío JS internamente usando V8 (requiere &lt;code&gt;node&lt;/code&gt; en el sistema o usa su versión embebida).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  ✅ Solución con Puppeteer (Node.js)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;headless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--no-sandbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--disable-setuid-sandbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://tu-sitio.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;networkidle0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Espera a que Cloudflare resuelva el desafío (se detecta por la ausencia del error)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#challenge-error-text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Requiere&lt;/strong&gt;: &lt;code&gt;npm install puppeteer&lt;/code&gt; y Chrome/Chromium instalado.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🌐 Caso 2: Navegador web (usuario final)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Habilita JavaScript&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome: &lt;code&gt;Configuración → Privacidad y seguridad → Seguridad → Habilitar JavaScript&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Firefox: &lt;code&gt;Preferencias → Privacidad y seguridad → Permisos → Habilitar JavaScript&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Edge: &lt;code&gt;Configuración de cookies y permisos del sitio → JavaScript → Permitir&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Habilita cookies de terceros&lt;/strong&gt; (si usas proxy, CDN o subdominios):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome: &lt;code&gt;Configuración → Privacidad y seguridad → Cookies y otros datos de sitio → Permitir cookies de terceros&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desactiva temporalmente extensiones de privacidad&lt;/strong&gt; (uBlock Origin, Privacy Badger, Ghostery).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limpia cookies y caché&lt;/strong&gt; del dominio problemático.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🛠️ Caso 3: Configuración del servidor (para evitar el desafío)
&lt;/h3&gt;

&lt;p&gt;Si tú controlas el backend y Cloudflare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agrega una regla de Firewall en Cloudflare&lt;/strong&gt; para excluir IPs confiables (ej. tu servidor de pruebas).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usa "Bypass" en modo "Under Attack"&lt;/strong&gt; → cambia a "I'm Under Attack" solo si es estrictamente necesario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configura reglas de WAF&lt;/strong&gt; para permitir solicitudes de tu user-agent (no recomendado para producción).&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;No desactive el desafío JS en producción&lt;/strong&gt;. Es una capa crítica de seguridad.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Pro-tip: Verifica si el desafío se resolvió
&lt;/h2&gt;

&lt;p&gt;Después de la solicitud, busca el cookie &lt;code&gt;cf_clearance&lt;/code&gt; en la respuesta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python example
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scraper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# Debería contener: {'cf_clearance': 'xxx'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si no está presente, &lt;strong&gt;el desafío no se resolvió&lt;/strong&gt; y la solicitud final fallará silenciosamente.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Solución aplicable al 100% de los casos reales&lt;/strong&gt;. Usa el método según tu entorno (automatización vs navegador). No hay atajos: si Cloudflare detecta que no hay ejecución JS real, bloqueará la solicitud.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>javascript</category>
      <category>security</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Cómo solucionar el error “Enable JavaScript and cookies to continue”</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:06:09 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-4im0</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-4im0</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error “Enable JavaScript and cookies to continue”
&lt;/h1&gt;

&lt;p&gt;Este mensaje aparece cuando &lt;strong&gt;Cloudflare&lt;/strong&gt; (u otro proxy inverso de seguridad) bloquea la solicitud del cliente porque detecta que el navegador no cumple con los requisitos mínimos de seguridad: JavaScript deshabilitado o cookies rechazadas. Es un mecanismo anti-bot y anti-abuso, no un error de tu código front-end.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Raíz técnica
&lt;/h2&gt;

&lt;p&gt;Cloudflare (o similar, como AWS WAF, Akamai, etc.) inyecta un &lt;em&gt;challenge&lt;/em&gt; (desafío) en la respuesta HTTP para verificar si el cliente es un navegador real. Si el navegador no ejecuta JavaScript ni acepta cookies, no puede superar el desafío y se muestra este mensaje.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Causas comunes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pruebas automatizadas con herramientas como &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt; (Python), o navegadores headless sin configuración adecuada.&lt;/li&gt;
&lt;li&gt;Extensiones del navegador que bloquean JavaScript o cookies (uBlock Origin, Privacy Badger, etc.).&lt;/li&gt;
&lt;li&gt;Configuración de privacidad estricta del navegador (modo incógnito con bloqueo de cookies de terceros).&lt;/li&gt;
&lt;li&gt;Solicitudes desde scripts backend que no simulan un navegador real (sin &lt;code&gt;User-Agent&lt;/code&gt;, sin cookies, sin JS).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Solución definitiva (por escenario)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ 1. Si estás haciendo pruebas con herramientas de automatización (Python/Node.js/etc.)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No uses solicitudes HTTP simples (&lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;axios&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;).&lt;/strong&gt; Debes simular un navegador real.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Solución recomendada: Usa &lt;strong&gt;Playwright&lt;/strong&gt; o &lt;strong&gt;Puppeteer&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ejemplo con Playwright (Python)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;playwright
playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;playwright.sync_api&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;sync_playwright&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tu-sitio.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# El desafío se resuelve automáticamente (si Cloudflare no usa reCAPTCHA avanzado)
&lt;/span&gt;    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Nota crítica&lt;/strong&gt;: Cloudflare ahora usa &lt;em&gt;Browser Integrity Check&lt;/em&gt; y &lt;em&gt;Interactive Challenges&lt;/em&gt;. Si el sitio usa Cloudflare &lt;em&gt;Under Attack Mode&lt;/em&gt; o &lt;em&gt;Managed Challenges&lt;/em&gt;, incluso Playwright puede fallar. En ese caso, usa &lt;code&gt;headful&lt;/code&gt; (navegador visible) y espera a que el desafío se resuelva.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🌐 2. Si eres usuario final (navegador)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desactiva temporalmente bloqueadores de anuncios/privacidad&lt;/strong&gt; (uBlock, AdGuard, Privacy Badger).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Habilita JavaScript y cookies&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Chrome: &lt;code&gt;Configuración → Privacidad y seguridad → Seguridad → Habilitar JavaScript&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cookies: &lt;code&gt;Configuración → Privacidad y seguridad → Cookies y otros datos de sitio → Permitir cookies&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prueba en modo incógnito limpio&lt;/strong&gt; (sin extensiones).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limpia cookies y caché&lt;/strong&gt; del dominio afectado.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧰 3. Si eres desarrollador del sitio (configuración Cloudflare)
&lt;/h3&gt;

&lt;p&gt;Si tú controlas el dominio y quieres evitar el desafío innecesario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;En Cloudflare Dashboard → Security → WAF → Rules&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Busca reglas como &lt;em&gt;"Browser Integrity Check"&lt;/em&gt; o &lt;em&gt;"JavaScript Challenge"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Desactívalas &lt;strong&gt;solo si tu tráfico es confiable&lt;/strong&gt; (no recomendado en producción).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opción más segura&lt;/strong&gt;: Usa &lt;em&gt;Managed Challenges&lt;/em&gt; y configura reglas para excluir IPs internas o bots legítimos (ej. Googlebot).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Nunca desactives todos los desafíos en producción&lt;/strong&gt;. Esto expone tu sitio a ataques DDoS y scraping masivo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧪 Verificación rápida
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre la consola del navegador (&lt;code&gt;F12&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Ve a la pestaña &lt;strong&gt;Network&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Recarga la página.&lt;/li&gt;
&lt;li&gt;Busca la solicitud principal (status &lt;code&gt;200&lt;/code&gt; o &lt;code&gt;403&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Si la respuesta contiene &lt;code&gt;&amp;lt;span id="challenge-error-text"&amp;gt;&lt;/code&gt;, el desafío no se resolvió.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📌 Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare no permite bypass programático ético&lt;/strong&gt;. Cualquier librería que prometa "saltar Cloudflare" (ej. &lt;code&gt;cloudscraper&lt;/code&gt;) es frágil, insegura y suele romperse con actualizaciones de Cloudflare.&lt;/li&gt;
&lt;li&gt;Si necesitas scraping, &lt;strong&gt;usa la API oficial del sitio&lt;/strong&gt; o &lt;strong&gt;pide acceso a un partner program&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Para pruebas internas, &lt;strong&gt;usa IPs whitelisted en Cloudflare&lt;/strong&gt; o despliega en un entorno sin WAF.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Solución inmediata para desarrollo local&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Ejecuta tu app en &lt;code&gt;localhost&lt;/code&gt; y configura Cloudflare para excluir &lt;code&gt;localhost&lt;/code&gt; del WAF (o usa &lt;code&gt;cf-no-challenge&lt;/code&gt; en el header de solicitud si estás en modo dev — solo en entornos controlados).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo solucionar el error \"Enable JavaScript and cookies to continue\"</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 02 Oct 2026 15:14:43 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-2j5g</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-2j5g</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error "Enable JavaScript and cookies to continue"
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;Este mensaje aparece cuando &lt;strong&gt;Cloudflare&lt;/strong&gt; (o un proxy similar como Turnstile, Akamai, o un WAF personalizado) bloquea la solicitud porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El navegador &lt;strong&gt;no ejecuta JavaScript&lt;/strong&gt; (o está deshabilitado).&lt;/li&gt;
&lt;li&gt;Las &lt;strong&gt;cookies no están habilitadas o no se están enviando&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El cliente (navegador o scraper) no completa el &lt;em&gt;challenge&lt;/em&gt; de seguridad (como un CAPTCHA o verificación de navegador).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En entornos automatizados (scraping, scripts, bots), esto suele suceder porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se usa una herramienta sin motor JS (p. ej., &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;axios&lt;/code&gt; sin renderizado).&lt;/li&gt;
&lt;li&gt;No se persisten ni envían cookies entre solicitudes.&lt;/li&gt;
&lt;li&gt;El User-Agent o headers no simulan un navegador real.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Solución definitiva (pasos)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Caso 1: Uso normal en navegador (usuario final)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Habilita JavaScript&lt;/strong&gt; en tu navegador:

&lt;ul&gt;
&lt;li&gt;Chrome: &lt;code&gt;Configuración &amp;gt; Privacidad y seguridad &amp;gt; Seguridad &amp;gt; Habilitar JavaScript&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Firefox: &lt;code&gt;Preferencias &amp;gt; Privacidad y seguridad &amp;gt; Permisos &amp;gt; Habilitar JavaScript&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Habilita cookies&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Asegúrate de que no estés en modo incógnito/privado (muchos bloquean cookies de terceros).&lt;/li&gt;
&lt;li&gt;Verifica que no tengas extensiones como uBlock Origin o Privacy Badger bloqueando scripts de Cloudflare.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limpia cookies y caché&lt;/strong&gt; del dominio afectado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reintenta&lt;/strong&gt; la solicitud.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  ✅ Caso 2: Automatización / scraping (Node.js, Python, etc.)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No puedes usar &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt;, o &lt;code&gt;curl&lt;/code&gt; directamente&lt;/strong&gt;. Necesitas un &lt;strong&gt;navegador real&lt;/strong&gt; con soporte JS y gestión de cookies.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Solución recomendada: Usa &lt;strong&gt;Playwright&lt;/strong&gt; (o Puppeteer)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo en Python con Playwright:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;playwright
playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;playwright.sync_api&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;sync_playwright&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# headless=True para producción
&lt;/span&gt;    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Navega a la URL (Cloudflare resolverá el challenge automáticamente)
&lt;/span&gt;    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://ejemplo.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wait_until&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;networkidle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Ahora puedes extraer contenido o interactuar
&lt;/span&gt;    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Clave&lt;/strong&gt;: Playwright ejecuta JS, maneja cookies, y simula un navegador real. Cloudflare lo detecta como "humano" y permite el acceso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Alternativa: Usa &lt;code&gt;cloudscraper&lt;/code&gt; (Python) — &lt;em&gt;solo para desafíos simples&lt;/em&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;cloudscraper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudscraper&lt;/span&gt;

&lt;span class="n"&gt;scraper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudscraper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_scraper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scraper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://ejemplo.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;❗ &lt;strong&gt;Limitación&lt;/strong&gt;: &lt;code&gt;cloudscraper&lt;/code&gt; falla con Cloudflare &lt;em&gt;Under Attack Mode&lt;/em&gt; o Turnstile. Usa Playwright para casos robustos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pro-tip: Evita bloqueos futuros
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simula headers reales&lt;/strong&gt;: Usa &lt;code&gt;User-Agent&lt;/code&gt;, &lt;code&gt;Accept-Language&lt;/code&gt;, &lt;code&gt;Referer&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incluye delays&lt;/strong&gt;: No hagas peticiones rápidas (Cloudflare detecta bots por tasa).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No uses IPs compartidas o de VPS conocidos&lt;/strong&gt;: Muchos están en listas negras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si es scraping profesional&lt;/strong&gt;: Considera usar proxies rotativos + headless browser + rotación de headers.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Regla de oro&lt;/strong&gt;: Si el servidor usa Cloudflare &lt;em&gt;Under Attack Mode&lt;/em&gt;, &lt;strong&gt;no hay atajo sin ejecutar JS&lt;/strong&gt;. El desafío es intencionalmente diseñado para bloquear clientes sin motor JS.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ &lt;strong&gt;Resultado esperado&lt;/strong&gt;: El bloqueo desaparece y el contenido se carga correctamente.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>javascript</category>
      <category>security</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Cómo solucionar el error “Enable JavaScript and cookies to continue”</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Thu, 01 Oct 2026 15:53:40 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-4kl2</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-enable-javascript-and-cookies-to-continue-4kl2</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error “Enable JavaScript and cookies to continue”
&lt;/h1&gt;

&lt;p&gt;Este mensaje aparece cuando &lt;strong&gt;Cloudflare&lt;/strong&gt; (u otro proxy de seguridad similar) bloquea la solicitud porque detecta que el navegador del cliente &lt;strong&gt;no cumple con los requisitos mínimos de seguridad&lt;/strong&gt;: JavaScript deshabilitado o cookies rechazadas.&lt;/p&gt;

&lt;p&gt;Pero si &lt;strong&gt;tú eres el desarrollador del sitio web&lt;/strong&gt; y ves este mensaje &lt;em&gt;en tu propio entorno de desarrollo o producción&lt;/em&gt;, el problema &lt;strong&gt;no es del usuario&lt;/strong&gt;, sino de tu configuración del servidor o de la forma en que estás sirviendo la aplicación.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Causa raíz técnica
&lt;/h2&gt;

&lt;p&gt;Cloudflare (o similar) inyecta una página de desafío (&lt;code&gt;/cdn-cgi/challenge-platform/...&lt;/code&gt;) cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El cliente no pasa el &lt;em&gt;JavaScript Challenge&lt;/em&gt; (no ejecuta JS).&lt;/li&gt;
&lt;li&gt;No envía cookies válidas (por ejemplo, &lt;code&gt;__cf_bm&lt;/code&gt;, &lt;code&gt;cf_clearance&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El navegador es considerado "no confiable" (básicamente, un bot o scraper).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O más común&lt;/strong&gt;: Estás accediendo directamente al servidor detrás de Cloudflare &lt;strong&gt;sin pasar por el proxy&lt;/strong&gt;, por lo que Cloudflare no puede completar su verificación y bloquea la solicitud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto &lt;strong&gt;no es un bug de tu frontend&lt;/strong&gt;, es un problema de infraestructura o configuración de red.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Solución definitiva (según tu entorno)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ Caso 1: Estás en desarrollo local (accidentalmente bypassing Cloudflare)
&lt;/h3&gt;

&lt;p&gt;Si usas &lt;code&gt;localhost&lt;/code&gt;, &lt;code&gt;127.0.0.1&lt;/code&gt;, o una IP directa del servidor (por ejemplo, &lt;code&gt;http://tu-servidor:3000&lt;/code&gt;), &lt;strong&gt;Cloudflare no interviene&lt;/strong&gt;, pero tu app podría estar configurada para esperar headers o cookies que solo Cloudflare añade.&lt;/p&gt;

&lt;h4&gt;
  
  
  Solución:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Usa el dominio real (con Cloudflare activo)&lt;/strong&gt; en desarrollo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edita tu &lt;code&gt;/etc/hosts&lt;/code&gt; (Linux/macOS) o &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; (Windows):
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 127.0.0.1 tu-dominio.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Accede a &lt;code&gt;http://tu-dominio.com&lt;/code&gt; (no a &lt;code&gt;localhost&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Asegúrate de que Cloudflare esté en modo &lt;strong&gt;Proxied&lt;/strong&gt; (nube naranja activa).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;O desactiva temporalmente el "Under Attack Mode" o "Browser Integrity Check"&lt;/strong&gt; en Cloudflare:

&lt;ul&gt;
&lt;li&gt;Panel → &lt;strong&gt;Security&lt;/strong&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → Desactiva &lt;em&gt;Under Attack Mode&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Panel → &lt;strong&gt;Firewall&lt;/strong&gt; → &lt;strong&gt;Rules&lt;/strong&gt; → Busca reglas que bloqueen JS/no-cookie y desactívalas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🛠️ Caso 2: Tu app no sirve JavaScript correctamente (después de pasar Cloudflare)
&lt;/h3&gt;

&lt;p&gt;Si el desafío se muestra &lt;strong&gt;después de cargar la página&lt;/strong&gt;, significa que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El JS no se descargó o falló al ejecutarse.&lt;/li&gt;
&lt;li&gt;Las cookies no se establecieron (por ejemplo, por &lt;code&gt;SameSite=None; Secure&lt;/code&gt; faltante).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Solución:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verifica que el archivo JS de Cloudflare se sirva correctamente&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abre DevTools → Network → Filtra por &lt;code&gt;js&lt;/code&gt; y busca &lt;code&gt;/cdn-cgi/challenge-platform/...&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si devuelve &lt;code&gt;403&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt; o &lt;code&gt;5xx&lt;/code&gt;, hay un problema de regla de firewall o configuración de WAF.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Asegura que las cookies se establezcan correctamente&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare usa cookies como &lt;code&gt;__cf_bm&lt;/code&gt; y &lt;code&gt;cf_clearance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si tu app usa &lt;code&gt;Set-Cookie&lt;/code&gt;, &lt;strong&gt;debe incluir&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt; Set-Cookie: cf_clearance=...; Path=/; Secure; HttpOnly; SameSite=None
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Si no usas HTTPS localmente, Cloudflare no establecerá cookies &lt;code&gt;Secure&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Habilita JavaScript en tu servidor (si usas Cloudflare Workers o WAF personalizado)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Asegúrate de que no estés bloqueando &lt;code&gt;POST /cdn-cgi/l/chk_js&lt;/code&gt; ni otros endpoints internos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🛠️ Caso 3: Estás usando un proxy inverso (nginx/Apache) detrás de Cloudflare
&lt;/h3&gt;

&lt;p&gt;Si usas &lt;code&gt;nginx&lt;/code&gt; o &lt;code&gt;Apache&lt;/code&gt; como proxy inverso, &lt;strong&gt;debes pasar los headers originales&lt;/strong&gt; para que Cloudflare valide la sesión.&lt;/p&gt;

&lt;h4&gt;
  
  
  Solución (nginx):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://tu-backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;CF-Connecting-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Opcional, pero útil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Si omites &lt;code&gt;X-Forwarded-For&lt;/code&gt;, Cloudflare no puede verificar la IP real y puede bloquear.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧪 Prueba rápida para confirmar la causa
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre tu sitio en &lt;strong&gt;modo incógnito&lt;/strong&gt; (sin extensiones).&lt;/li&gt;
&lt;li&gt;Usa DevTools → Network → Filtra por &lt;code&gt;document&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si ves una respuesta &lt;code&gt;200&lt;/code&gt; con contenido HTML que contiene &lt;code&gt;&amp;lt;span id="challenge-error-text"&amp;gt;&lt;/code&gt;, &lt;strong&gt;el servidor está respondiendo el desafío&lt;/strong&gt; → problema de configuración.&lt;/li&gt;
&lt;li&gt;Si el JS falla al ejecutarse (error en consola), el problema es de carga de recursos.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💡 Pro-tip: Evita este error en desarrollo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;strong&gt;Cloudflare Tunnel (&lt;code&gt;cloudflared&lt;/code&gt;)&lt;/strong&gt; para exponer tu localhost &lt;em&gt;a través de Cloudflare&lt;/em&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  cloudflared tunnel &lt;span class="nt"&gt;--hostname&lt;/span&gt; tu-dominio.com &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto simula el entorno real y evita desafíos falsos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En producción, &lt;strong&gt;nunca sirvas directamente desde el servidor&lt;/strong&gt; (sin pasar por Cloudflare). Usa siempre el DNS apuntando al proxy.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Solución final rápida (copiar y pegar)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Si estás en desarrollo, edita tu &lt;code&gt;/etc/hosts&lt;/code&gt; para usar el dominio real y accede por HTTPS (o activa "SSL/TLS → Flexible" en Cloudflare).&lt;br&gt;&lt;br&gt;
Si estás en producción, revisa tus reglas de Firewall y asegura que &lt;code&gt;X-Forwarded-For&lt;/code&gt; se pase correctamente en el proxy inverso.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
