google.com/goto: läs Location med HEAD
Google Search lägger inte alltid den slutliga URL:en i resultatets href längre. Organiska resultat pekar på https://www.google.com/goto?url=CAES…. Det är inte det gamla google.com/url?q=…: parametern är inte en kodad URL. Den avkodas inte.
Google måste ändå känna destinationen. Den läggs i HTTP-headern Location när du anropar /goto. Det är den read vi använder.
Exempel i curl, Python och Node: github.com/automdev/google-goto-url-fix. Automs Google Search-API gör hoppet på servern.
Utrullningen och varför: google.com/goto: Googles anti-scraping-uppdatering.
En mening
Följ inte omdirigeringen. Läs 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 begär bara headers. GET med redirect: "manual" (eller allow_redirects=False) läser samma sak. Google svarar ibland 402 (eller en annan status) med Location: läs headern även när det inte är ett 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 är HEAD. Utan -L följer curl inte. Raden Location: är den riktiga URL:en.
Samma read med 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"))
Om HEAD är tom, försök igen med GET utan att följa:
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"));
I en webbläsare kan ett manuellt 3xx dyka upp som opaqueredirect och dölja headern. I Node syns headers.
Varför inte avkoda CAES?
Blobben är inte ett publikt URL-protobuf. Det är en ogenomskinlig referens. Bara Google känner målet och lägger det i Location vid hoppet. Att limma ihop ett synligt namn ("LinkedIn · Satya Nadella") till en URL är en dålig idé.
href är /goto. Sidan känner fortfarande URL:en.
Google kan inte dölja destinationen helt. Den behöver den riktiga URL:en för att rita SERP:en: synlig domän, favicon, attributionsblock. De värdena finns fortfarande på sidan, oftast i ett dataskript längst ner, och i ett internt store (W_jd) som SERP-JavaScriptet läser.
Därför «städas» länkarna i vissa webbläsare efter en musrörelse: ett skript läser W_jd och skriver om varje /goto-href till den riktiga URL:en. Det täcker bara organiskt under #rso div[data-rpos] med ett attributionsblock. AI Overviews stannar på /goto. Det krävs en live sida och den första musrörelsen. Ett headless fetch av HTML:en triggar det inte. Chrome lämnar ofta /goto-hrefs orörda.
Ett annat läckage sitter på länken «Översätt den här sidan». Om UI-språket inte matchar resultatets språk lägger Google till den kontrollen, och den rena URL:en sitter ofta där. Latin (Accept-Language: la) syns nästan varje gång, eftersom nästan inga sidor är på latin.
Det är förklaringar av vad sidan fortfarande innehåller. Det är skört: Google kan byta namn på W_jd, ändra skriptet eller ta bort översättningskontrollen. Det ger heller inget stabilt API-fält.
Den hållbara read:en är fortfarande Location på /goto. Ingen live DOM, inget musevent, inget språktrick.
På Autom
Google Search-API:t löser redan /goto och returnerar den slutliga URL:en i 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"}'
Kod och README: github.com/automdev/google-goto-url-fix.
Relaterad läsning
- google.com/goto: Googles anti-scraping-uppdatering
- Google dödade num=100
- Google stämmer SerpAPI: vad SearchGuard avslöjar
1 000 gratis förfrågningar på Autom pricing, API-nyckel på app.autom.dev/register.