Prerender y SEO para SPA: que te vean en buscadores, en la IA y en redes.
Que te vean en buscadores, en la IA y en redes.
Jazui es un servicio de prerender y SEO para SPA (Angular, React, Vue, Blazor, Svelte...). Sirve a Google, a los bots de IA (ChatGPT, Claude, Perplexity...) y a las redes sociales el HTML ya renderizado de su web, sin tocar su código. Además le dice quién le visita y qué falla, y difunde su contenido con un blog, IA con su propia clave y métricas. Las personas nunca pasan por Jazui: siguen usando su aplicación de siempre. Jazui está hecho con AstrolUI.
En una SPA el HTML inicial está casi vacío y el contenido lo genera JavaScript en el navegador (en Blazor WebAssembly, además, primero se descarga el runtime de .NET). Muchos bots no ejecutan JavaScript o lo hacen tarde y con límites: el resultado es una indexación incompleta, títulos y descripciones genéricos, vistas previas vacías al compartir un enlace y respuestas de IA que no citan su web.
El prerender entrega a cada bot una versión HTML ya renderizada de la página, con su contenido, sus etiquetas meta y Open Graph y el código de estado real (200, 404, redirección...), sin cambiar nada de la aplicación.
Para empezar: cree la cuenta, añada el sitio, verifique el dominio (DNS o etiqueta meta) y conecte la integración.
Elija dónde se reconoce a los bots. Cada tarjeta lleva a su guía en la documentación de Jazui.
Blazor servido por ASP.NET Core (WebAssembly hospedado o Blazor Web App): instale Jazui.AspNetCore desde el mismo feed de AstrolUI y añada el middleware antes de los archivos estáticos y del fallback. Es la opción más robusta: si Jazui tarda o falla, el bot recibe la página normal. El token va en la variable de entorno Jazui__Token.
dotnet nuget add source https://nuget.astrolui.com/v3/index.json --name AstrolUIdotnet add package Jazui.AspNetCore// Program.cs of the ASP.NET Core app that serves the Blazor WebAssembly clientbuilder.Services.AddJazui(builder.Configuration); // section "Jazui": Token, SiteUrl, Timeout... var app = builder.Build();app.UseForwardedHeaders(); // only behind a proxy or CDNapp.UseJazui(); // before the static files and the SPA fallbackapp.UseStaticFiles();app.MapFallbackToFile("index.html");app.Run(); // Token: environment variable Jazui__Token (never in appsettings.json)Blazor WebAssembly estático en IIS: añada la regla «Jazui» como primera regla del web.config que ya tiene el sitio (no lo sustituya: trae los tipos MIME y las reglas de Blazor) y active una vez por servidor el proxy de ARR y las variables del servidor. Detrás de Cloudflare, la IP del bot sale de {HTTP_CF_CONNECTING_IP}. Active la regla cuando el sitio ya esté verificado en Jazui: con ARR, si Jazui responde con error, el bot recibe ese error.
<!-- First rule of <rewrite><rules>, before the Blazor SPA fallback. Full bot list: https://docs.jazui.com/example_config/iis_web.xml --><rule name="Jazui" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTP_USER_AGENT}#{QUERY_STRING}" pattern="^[^#]*(?:googlebot|bingbot|gptbot|chatgpt|claudebot|perplexity|facebookexternalhit|linkedinbot|whatsapp|...)|#.*_escaped_fragment_" /> <add input="{REQUEST_METHOD}" pattern="^(GET|HEAD)$" /> <add input="{HTTP_X_JAZUI}" pattern=".+" negate="true" /> <add input="{URL}" pattern="\.(js|mjs|css|map|json|xml|txt|ico|png|jpg|svg|woff|woff2|wasm|dll|dat|blat|br|gz|pdf)$" negate="true" /> </conditions> <serverVariables> <set name="HTTP_AUTHORIZATION" value="Bearer [JAZUI_TOKEN]" /> <set name="HTTP_X_JAZUI_URL" value="https://{HTTP_HOST}{UNENCODED_URL}" /> <set name="HTTP_X_JAZUI_CLIENT_IP" value="{REMOTE_ADDR}" /> <!-- behind Cloudflare: {HTTP_CF_CONNECTING_IP} --> <set name="HTTP_COOKIE" value="" /> </serverVariables> <action type="Rewrite" url="https://api.jazui.com/Render" appendQueryString="false" /></rule>rem Once per server, as administrator: ARR proxy and the server variables the rule writes%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy /enabled:"True" /commit:apphost%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/rewrite/allowedServerVariables /+"[name='HTTP_AUTHORIZATION']" /+"[name='HTTP_X_JAZUI_URL']" /+"[name='HTTP_X_JAZUI_CLIENT_IP']" /+"[name='HTTP_COOKIE']" /commit:apphostEn cada página, para que la nota SEO suba y las vistas previas salgan bien:
<PageTitle>Product X | MyStore</PageTitle><AstrolTitle Icon="astrol-basket" Text="Product X"> <HeadContent> <meta name="description" content="Short description that will appear in Google" /> <meta property="og:title" content="Product X" /> <meta property="og:description" content="Preview text for WhatsApp, LinkedIn, X..." /> <meta property="og:image" content="https://mystore.com/img/product-x.jpg" /> <link rel="canonical" href="https://mystore.com/product/x" /> </HeadContent></AstrolTitle>Todas las integraciones llaman a GET https://api.jazui.com/Render?url= con la URL completa codificada (o en la cabecera X-Jazui-Url) y Authorization: Bearer con el token de render de la cuenta o el de un sitio, que por convención va en la variable JAZUI_TOKEN (o Jazui__Token en .NET). Opcionales: botAgent, X-Jazui-Client-IP (la IP del bot) e If-None-Match. La respuesta solo se entrega al bot si trae X-Jazui: true; con X-Jazui-Blocked el bot está bloqueado (403) y en cualquier otro caso se sirve la web normal. Para no entrar en bucle, las integraciones dejan pasar las peticiones que ya traen la cabecera X-Jazui. Nunca exponga el token en el cliente.
Hay además APIs de caché (recachear, purgar), webhooks firmados, blog y archivos del sitio: ver docs.jazui.com/api.
curl "https://api.jazui.com/Render?url=https%3A%2F%2Fexample.com%2F&botAgent=integration-test" \ -H "Authorization: Bearer $JAZUI_TOKEN" -i # Deliver the response to the bot only if it carries X-Jazui: true (any status: 200, 301, 404...).# X-Jazui-Blocked = blocked bot (403). Anything else, or a timeout: serve the normal site.Jazui tiene un plan gratuito y planes de pago mensuales o anuales con prueba gratuita. Los precios y los límites de cada plan están siempre al día en jazui.com/plan.