Google Adsense y SSR con Angular y Spring Boot

bornex

Buenas, seguramente algunos os acordaréis del hilo de seguimiento que hice hace un tiempo cuando empezó la pandemia sobre una app para digitalizar cartas con QR.

El caso es que al final le metimos Google Adsense y nos estaba dando algún dinero para pagar el servidor y poco más pero nos banearon la cuenta por "Inventario valioso: sin contenido: No se pueden monetizar las páginas que no tengan contenido.". Google solo nos da una única oportunidad para apelar y poder recuperar la cuenta (ya se que es casi imposible de recuperar una vez baneada, pero queremos intentarlo).

Para poder hacer que el intento tenga el mayor éxito posible hemos metido un blog chustero super estático (con pre-rendering y angular universal) y ahora queremos hacer una parte de la web que esta hecha puramente con SPA y pasarla a SSR, en concreto queremos hacer que la ruta que muestra las cartas digitales p.e. /show/123-xyz, sea totalmente renderizada en el servidor y poder hacer algo así como una página donde se encuentren todas las cartas y hacer un ranking, creemos que esto puede aumentar el SEO y quitarnos de encima el "Inventario valioso: sin contenido" de Google Adsense, ya que es en esas páginas donde se muestran los anuncios.

Ahora mismo esta ruta (p.e. /show/123-xyz) realmente no existe, ya que lo que hacemos es una vez nos llega la petición a nginx la mandamos a spring que lo que hará será devolver un JSON en una cookie y redireccionar al index donde se cargará el router de angular y cogeremos la cookie y pintaremos el contenido, con lo que de /show/123-xyz pasamos a /show. El caso es que esto no nos vale ni tampoco nos vale la ñapa de hacer lo mismo pero mantener la ruta /show/123-xyz ya que seguimos sin servir el contenido desde el servidor y a Google Adsense eso no le mola.

El resultado final que queremos conseguir es:

  1. Browser GET /show/123-xyz -> 2. Nginx redirige al backend Spring -> 3. Spring devuelve el HTML con el contenido listo -> 4. la URL en el browser se queda fija con /show/123-xyz

El problema viene ahora que sólo se me ocurren las siguientes opciones:

  1. Meterle con node.js un express que actue de middleware y hacer que se encargue del SSR haciendo las peticiones a Spring para recuperar los datos (me parece un trabajazo pero creo que sería la mejor opción).
  2. Pasar todo el código de angular que se encarga de renderizar las cartas digitales a plantillas thymeleaf, HTML, CSS y JS (otra mataura).

¿Se os ocurre alguna otra forma de solucionar el problema sin liarla mucho?

W0rd

Vas a tener que usar node.js si quieres algo decente, ten en cuenta que tienes que interpretar js, algo que node.js lo hace sin problemas
https://github.com/angular/universal/tree/master/modules/express-engine

Se puede mejorar añadiendo una cache para esas requests con contenido estático o que no cambian con frecuencia (esto lo puedes hacer con cualquier app web)
http://acmeextension.com/most-popular-web-caching-server/

Un planteamiento interesante puede ser activar el ssr solo cuando se detecta un user agent de un web crawler, google, bing, yahoo, twitter, facebook etc
En una buscada rápida sale esto
https://gist.github.com/baunov/e1ecdb899e7be9ecf65a25b8c1a418d6
Con esto mantienes la spa para la gente normal y dejas el ssr solo para los buscadores y otros extractores de contenido.

1
bornex

Realmente es lo que me temía, ¿Entre rehacer la página entera en thymeleaf o tirar por el tema de nodejs que me recomendarías?

El caso es que si tiro por el nodejs, tengo que empezar a empaparme bien como hacerlo, configurarlo, desplegarlo y demás, me va llevar más tiempo (creo), frente a coger el html, CSS y js y rehacer esa página exclusiva en thymeleaf, que realmente sería coger el html de angular y pasarlo a thymeleaf, el scss pasarlo a CSS y el js diría que es mínimo ya que no hay mucha funcionalidad ahí.

W0rd

yo personalmente me quedaría con angular, si has trabajado angular deberías ser capaz de levantar un server simple de node, no tiene mucha complicación

1 1 respuesta
isvidal

Dejar de usar Angular y pasar a React, SSR con NextJs/Gatsby o similares

1 1 respuesta
bornex

#4 acabo de ponerlo en prod, funciona de puta madre. Al final era más fácil de lo que pensaba, ahora tengo que arreglar un par de cosillas pero ya esta andando y vamos a poder continuar con el desarrollo!

1
Martita-

#5
Eres un nazi de React xDDD.

Kaledros

No sé exactamente por qué pero Safari en iOS me bloquea este hilo por el contenido. Flipo.

bornex

Bueno gente, acabamos de subir todos los cambios necesarios para el SSR y acabamos de mandar el formulario de apelación de Google AdSense :fingers_crossed:

Posteare por aquí el resultado final y si nos han devuelto o no los anuncios.

Como dato curioso, al meter angular universal con SSR teníamos un problema con peticiones HTTP dobles, se estaban haciendo dobles porque node.js cargaba el angular y lo interpretaba (1 petición) y luego al cargar el JS en el navegador estaba de nuevo haciendo la petición HTTP. Parece que es un problema bastante común y lo arreglamos metiendo una dependencia en el app.module.

Cosas aprendidas a fuego:

  1. Si la web va de cara al público, SSR de cabeza.
  2. No usar Angular nunca más.
1 respuesta
r2d2rigo

#9 no, lo que deberias haber aprendido es a no confiar en Google nunca.

Ojala tengas suerte pero te aviso que la apelacion de baneos de AdSense es casi imposible que te la acepten, lo tienen montado de tal manera que hay una barrera de bots que se la pela lo que escribas y muy pocas veces vas a acabar ante una persona fisica que vea tu situacion y haga algo.

1 1 respuesta
bornex

#10 Ya lo sabemos, varios colegas en situaciones parecidas en el pasado me han dicho lo mismo, que me olvidé. Pero bueno, por probar que no quede

Usuarios habituales

  • bornex
  • r2d2rigo
  • Kaledros
  • Martita-
  • isvidal
  • W0rd