Google
|
par Autom Team

google.com/goto : lire Location avec HEAD

Google Search n’écrit plus toujours l’URL finale dans le href du résultat. Les résultats organiques pointent vers https://www.google.com/goto?url=CAES…. Ce n’est pas l’ancien google.com/url?q=… : le paramètre n’est pas une URL encodée. On ne le décode pas.

Google doit quand même connaître la destination. Il la pose dans l’en-tête HTTP Location quand on interroge /goto. C’est cette lecture qu’on utilise.

Exemples curl, Python et Node : github.com/automdev/google-goto-url-fix. Chez Autom, l’API Google Search applique ce hop côté serveur.

Le déploiement et le pourquoi : google.com/goto : l'anti-scraping de Google.

Une phrase

Ne pas suivre la redirection. Lire Location.

GET /goto?url=CAES…  HTTP/1.1
Host: www.google.com

HTTP/1.1 302 Found
Location: https://www.linkedin.com/in/satyanadella

HEAD demande uniquement les en-têtes. GET avec redirect: "manual" (ou allow_redirects=False) fait la même lecture. Google renvoie parfois un 402 (ou un autre statut) avec un Location : on lit l’en-tête même si ce n’est pas un 3xx.

curl

curl -sI --max-redirs 0 \
  -H 'Referer: https://www.google.com/search' \
  'https://www.google.com/goto?url=CAES...' \
  | grep -i '^location:'

-I = HEAD. Sans -L, curl ne suit pas. La ligne Location: est l’URL réelle.

Même lecture en GET :

curl -sD - -o /dev/null --max-redirs 0 \
  -H 'Referer: https://www.google.com/search' \
  'https://www.google.com/goto?url=CAES...' \
  | grep -i '^location:'

Python

import requests

goto = "https://www.google.com/goto?url=CAES..."
r = requests.head(
    goto,
    allow_redirects=False,
    headers={"Referer": "https://www.google.com/search"},
    timeout=10,
)
print(r.status_code, r.headers.get("Location"))

Si HEAD est vide, retenter en GET sans suivre :

r = requests.get(goto, allow_redirects=False, timeout=10)
print(r.headers.get("Location"))

Node

const res = await fetch(goto, {
  method: "HEAD",
  redirect: "manual",
  headers: { Referer: "https://www.google.com/search" },
});
console.log(res.status, res.headers.get("location"));

Dans un navigateur, un 3xx en redirect: "manual" peut arriver en opaqueredirect et masquer l’en-tête. En Node, les en-têtes sont visibles.

Pourquoi pas décoder CAES ?

Le blob n’est pas un protobuf d’URL publique. C’est une référence opaque. Seul Google connaît la cible, et il la pose dans Location au moment du hop. Recoller un nom visible ("LinkedIn · Satya Nadella") pour inventer une URL est une mauvaise idée.

Le href est /goto. La page connaît encore l’URL.

Google ne peut pas cacher complètement la destination. Il en a besoin pour dessiner la SERP : le domaine visible, le favicon, le bloc d’attribution. Ces valeurs sont encore sur la page, souvent dans un script de données en bas, et dans un store interne (W_jd) que le JavaScript de la SERP lit.

C’est pour ça que, dans certains navigateurs, les liens « se nettoient » après un mouvement de souris : un script lit W_jd et réécrit chaque href /goto avec l’URL réelle. Ça ne couvre que l’organique sous #rso div[data-rpos] avec un bloc d’attribution. Les AI Overviews restent en /goto. Il faut une page live et ce premier mouvement de souris. Un fetch headless du HTML ne le déclenche pas. Chrome laisse souvent les href /goto en place.

Autre fuite : le lien « Traduire cette page ». Si la langue de l’UI ne correspond pas à celle des résultats, Google ajoute ce contrôle et l’URL propre est souvent dessus. Le latin (Accept-Language: la) apparaît presque à chaque fois, parce que presque aucune page n’est en latin.

Ce sont des explications de ce que la page contient encore. C’est fragile : Google peut renommer W_jd, changer le script, ou retirer le contrôle de traduction. Ça ne donne pas non plus un champ API stable.

La lecture durable reste Location sur /goto. Pas de DOM live, pas d’événement souris, pas de truc de langue.

Chez Autom

L’API Google Search résout déjà /goto et renvoie l’URL finale dans organic_results[].link.

curl -s https://api.autom.dev/v1/google/search \
  -H "x-api-key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"linkedin.com/in satya nadella","gl":"us","hl":"en"}'

Code et README : github.com/automdev/google-goto-url-fix.

Lectures associées

1 000 requêtes gratuites sur les tarifs Autom, clé API sur app.autom.dev/register.

SERP API

Discover why Autom is the preferred API provider for developers.