Mixbot: Cloudflare bloquea el crawler de Facebook, preview de compartir sale genérica #170

Open
opened 2026-07-10 01:43:47 +00:00 by rafa · 1 comment
Owner

Síntoma

Al compartir un artículo en Facebook (botón "Compartir" del sitio, facebook.com/sharer/sharer.php?u=...), la preview que muestra Facebook es genérica (solo "feadulta.com"), no la del artículo concreto (título/descripción/imagen del post compartido).

Diagnóstico

Comprobado en origen (SSH al server, curl a 127.0.0.1 con Host: www.feadulta.com, bypasseando Cloudflare): las etiquetas Open Graph del artículo están perfectas y específicas:

og:title: "Yo soy pan que se parte y se reparte"
og:description: "CORPUS (A) Jn 6,51-59 La eucaristía es una realidad..."
og:url: https://www.feadulta.com/yo-soy-pan-que-se-parte-y-se-reparte/

El botón de compartir (fea-share.php) enlaza correctamente a esa URL — no es un bug del sitio ni del HTML generado.

El problema es que Cloudflare devuelve 403 a cualquier request "no-navegador" contra www.feadulta.com. Lo he comprobado con curl (varios User-Agents), con un Chromium headless (Playwright) y con la herramienta de fetch externa de Anthropic — los tres bloqueados. Es casi seguro que el crawler de Facebook (facebookexternalhit) choca con el mismo bloqueo al intentar leer las etiquetas OG del artículo, y por eso Facebook cae al fallback genérico (o sirve un scrape cacheado de cuando no pudo entrar).

Mismo tipo de bloqueo que ya está fichado en el issue #145 (Cloudflare 403 a la REST API), pero aquí afecta al crawler de compartidos de Facebook en vez de a la API.

Qué hace falta (lado Cloudflare)

  1. Regla de WAF / Bot Fight Mode que permita explícitamente facebookexternalhit (y de paso los crawlers legítimos de otras redes: Twitterbot, WhatsApp, Slackbot, etc.).
  2. Una vez permitido, forzar a Facebook a re-rastrear las URLs ya compartidas con el Sharing Debugger — si no, seguirá sirviendo su caché vieja aunque Cloudflare ya deje pasar al bot.

Relacionado: #145.

## Síntoma Al compartir un artículo en Facebook (botón "Compartir" del sitio, `facebook.com/sharer/sharer.php?u=...`), la preview que muestra Facebook es genérica (solo "feadulta.com"), no la del artículo concreto (título/descripción/imagen del post compartido). ## Diagnóstico Comprobado en origen (SSH al server, `curl` a `127.0.0.1` con `Host: www.feadulta.com`, bypasseando Cloudflare): las etiquetas Open Graph del artículo están perfectas y específicas: ``` og:title: "Yo soy pan que se parte y se reparte" og:description: "CORPUS (A) Jn 6,51-59 La eucaristía es una realidad..." og:url: https://www.feadulta.com/yo-soy-pan-que-se-parte-y-se-reparte/ ``` El botón de compartir (`fea-share.php`) enlaza correctamente a esa URL — no es un bug del sitio ni del HTML generado. El problema es que **Cloudflare devuelve 403** a cualquier request "no-navegador" contra `www.feadulta.com`. Lo he comprobado con `curl` (varios User-Agents), con un Chromium headless (Playwright) y con la herramienta de fetch externa de Anthropic — los tres bloqueados. Es casi seguro que el crawler de Facebook (`facebookexternalhit`) choca con el mismo bloqueo al intentar leer las etiquetas OG del artículo, y por eso Facebook cae al fallback genérico (o sirve un scrape cacheado de cuando no pudo entrar). Mismo tipo de bloqueo que ya está fichado en el issue #145 (Cloudflare 403 a la REST API), pero aquí afecta al crawler de compartidos de Facebook en vez de a la API. ## Qué hace falta (lado Cloudflare) 1. Regla de WAF / Bot Fight Mode que permita explícitamente `facebookexternalhit` (y de paso los crawlers legítimos de otras redes: `Twitterbot`, `WhatsApp`, `Slackbot`, etc.). 2. Una vez permitido, forzar a Facebook a re-rastrear las URLs ya compartidas con el [Sharing Debugger](https://developers.facebook.com/tools/debug/) — si no, seguirá sirviendo su caché vieja aunque Cloudflare ya deje pasar al bot. Relacionado: #145.
Collaborator

Resuelto (lado Cloudflare, Inma)

Al mirar las Custom rules de Cloudflare vimos que ya tenías una regla "Permitir Facebook" (Skip para facebookexternalhit) — por eso, sondeando ahora, el crawler de Facebook ya pasaba (200). Es probable que la añadieras después de abrir este issue.

Lo que seguía bloqueado era Twitter/X (403, lo tumbaba "bloquear bots 1") y no estaban contemplados otros crawlers sociales.

Cambio aplicado: ampliada esa regla → renombrada a "Permitir crawlers sociales" (acción Skip, saltando all remaining custom rules + rate limiting + managed rules), con esta expresión:

(http.user_agent contains "facebookexternalhit") or (http.user_agent contains "Twitterbot") or (http.user_agent contains "WhatsApp") or (http.user_agent contains "Slackbot") or (http.user_agent contains "LinkedInBot") or (http.user_agent contains "TelegramBot") or (http.user_agent contains "Discordbot") or (http.user_agent contains "Pinterest") or (http.user_agent contains "SkypeUriPreview")

Verificado (sondeo externo a https://www.feadulta.com/echar-raices/ con cada UA):

Crawler Antes Ahora
Twitter/X 403 200
Facebook, WhatsApp, Telegram, Slack, LinkedIn, Discord, Pinterest 200

Etiquetas OG correctas (og:title "Echar raíces", descripción e imagen). A partir de ahora las comparticiones nuevas en esas redes saldrán con la tarjeta buena.

Nota (punto 2 del issue): el re-escaneo con el Sharing Debugger solo hace falta para URLs ya compartidas que tengan caché vieja en Facebook — no es masivo; Inma apenas comparte en FB, así que se puede omitir (o hacerlo puntualmente para la home/carta si interesa).

Por nuestra parte, se puede cerrar. 🎯

## Resuelto (lado Cloudflare, Inma) Al mirar las **Custom rules** de Cloudflare vimos que **ya tenías una regla "Permitir Facebook"** (Skip para `facebookexternalhit`) — por eso, sondeando ahora, el crawler de Facebook **ya pasaba (200)**. Es probable que la añadieras después de abrir este issue. Lo que **seguía bloqueado** era **Twitter/X** (403, lo tumbaba "bloquear bots 1") y no estaban contemplados otros crawlers sociales. **Cambio aplicado:** ampliada esa regla → renombrada a **"Permitir crawlers sociales"** (acción **Skip**, saltando *all remaining custom rules* + rate limiting + managed rules), con esta expresión: ``` (http.user_agent contains "facebookexternalhit") or (http.user_agent contains "Twitterbot") or (http.user_agent contains "WhatsApp") or (http.user_agent contains "Slackbot") or (http.user_agent contains "LinkedInBot") or (http.user_agent contains "TelegramBot") or (http.user_agent contains "Discordbot") or (http.user_agent contains "Pinterest") or (http.user_agent contains "SkypeUriPreview") ``` **Verificado** (sondeo externo a `https://www.feadulta.com/echar-raices/` con cada UA): | Crawler | Antes | Ahora | |---|---|---| | Twitter/X | 403 | **200** ✅ | | Facebook, WhatsApp, Telegram, Slack, LinkedIn, Discord, Pinterest | — | **200** ✅ | Etiquetas OG correctas (`og:title` "Echar raíces", descripción e imagen). A partir de ahora las comparticiones nuevas en esas redes saldrán con la tarjeta buena. **Nota (punto 2 del issue):** el re-escaneo con el Sharing Debugger solo hace falta para URLs ya compartidas que tengan caché vieja en Facebook — no es masivo; Inma apenas comparte en FB, así que se puede omitir (o hacerlo puntualmente para la home/carta si interesa). Por nuestra parte, **se puede cerrar.** 🎯
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#170