# EIRES — Real Estate Luxembourg # https://eires.lu # # UN SEUL GROUPE, PARTAGÉ PAR TOUS LES ROBOTS (16/09/2026) # ───────────────────────────────────────────────────────── # Ce fichier déclarait 31 groupes. DEUX portaient des règles ; les 29 autres # n'avaient qu'un `Allow: /` et pas un seul `Disallow`. Or un robot n'obéit # qu'au groupe le plus spécifique qui le NOMME et ignore entièrement `*` # (RFC 9309 § 2.2.1 ; Google : « Only one group is valid for a particular # crawler »). Tout le bloc protecteur écrit sous `User-agent: *` ne # s'appliquait donc à AUCUN des robots nommés — Bing, Apple, Yandex, les # moteurs génératifs et tous les robots d'aperçu de lien exploraient # librement `/admin`, `/api/`, les portails à jeton et `/r/`. Le groupe # `Googlebot` lui-même omettait neuf règles de `*`, alors que le fichier # annonçait un « mirror Googlebot block above » : le miroir avait été écrit # à moitié, et rien ne le mesurait. # # D'où la forme actuelle : des lignes `User-agent` CONSÉCUTIVES forment un # seul groupe, `*` compris. Il n'y a donc plus qu'un jeu de règles, et # l'asymétrie ne peut plus réapparaître — un robot ajouté demain hérite du # bloc par construction, sans qu'on ait à recopier quoi que ce soit. # Garde : `src/test/robots-groupes.test.ts`. # # NE PAS réintroduire un groupe par robot. Si un robot doit avoir un régime # propre, son groupe doit porter le bloc ENTIER plus sa différence — et la # garde le vérifiera. # ----- Search engines (full crawl) ----- User-agent: Googlebot User-agent: Googlebot-Image User-agent: Bingbot User-agent: DuckDuckBot User-agent: Slurp User-agent: YandexBot User-agent: Applebot # ----- Social / link previews ----- User-agent: Twitterbot User-agent: facebookexternalhit User-agent: LinkedInBot User-agent: WhatsApp User-agent: TelegramBot User-agent: Discordbot User-agent: Pinterestbot # ----- AI / LLM crawlers (GEO — Generative Engine Optimization) ----- # NE PAS renommer ce titre ni celui de la section suivante : # `scripts/check-seo-route-sync.mjs` capture la liste des robots IA ENTRE # les deux, pour la comparer à AI_BOT_RE du Worker (contrôle H). # Autorisation EXPLICITE + /llms.txt : ChatGPT, Claude, Perplexity, Gemini et # les autres peuvent fonder leurs réponses sur des faits vérifiés. User-agent: GPTBot User-agent: ChatGPT-User User-agent: OAI-SearchBot User-agent: ClaudeBot User-agent: Claude-Web User-agent: Claude-User User-agent: Claude-SearchBot User-agent: anthropic-ai User-agent: PerplexityBot User-agent: Perplexity-User User-agent: Google-Extended User-agent: Bytespider User-agent: Amazonbot User-agent: Meta-ExternalAgent User-agent: cohere-ai User-agent: MistralAI-User # ----- All other crawlers ----- # (nommés ou non : ils partagent le bloc de règles unique ci-dessous) User-agent: * Allow: / # Le sitemap Google News vit sous /api/ mais est public : sans cette exception # AVANT le blocage, les crawlers le trouvent interdit et le signalent comme # sitemap inaccessible (audit Semrush du 13/08/2026). Allow: /api/public/fn/perspectives-news-sitemap # ----- Surfaces qui AGISSENT ou portent un jeton ----- # Reconfirmation de rendez-vous en une tape (/r/, lien envoyé par e-mail # ET par SMS). Depuis le 16/09/2026 un GET n'y écrit plus rien — seul le POST # du bouton confirme (cf. src/lib/edge/cal-booking-reconfirm.ts). Ce blocage # reste la ceinture de la bretelle, et RIEN DE PLUS : robots.txt est une # convention d'exploration, pas un contrôle d'accès, et les scanners de liens # d'entreprise ne le lisent pas. Ne jamais en refaire l'unique protection. Disallow: /r/ Disallow: /estimation/r/ Disallow: /valuation/r/ Disallow: /bewertung/r/ Disallow: /schaetzung/r/ Disallow: /en/estimation/r/ Disallow: /en/valuation/r/ Disallow: /de/estimation/r/ Disallow: /de/bewertung/r/ Disallow: /de/schaetzung/r/ # Portails privés à jeton (propriétaire, acquéreur, signature, partages # d'estimation) — accès nominatif, noindex côté page : jamais à crawler. Disallow: /portail/ Disallow: /owner-portal Disallow: /buyer-portal/ Disallow: /eigentuemer-portal Disallow: /kaeufer-portal/ Disallow: /sav/ # Dossier d'un lot de programme neuf (/dossier/, 18/10/2026) : lien # personnel envoyé par e-mail, adresse complète du programme, noindex. Disallow: /dossier/ Disallow: /bail/ # Signature du bail et suivi après-vente dans les sept autres langues # (lot 7, 02/11/2026, src/lib/clientPortalPaths.ts) : lien personnel à jeton. Disallow: /en/lease-signature/ Disallow: /de/mietvertrag-unterschrift/ Disallow: /pt/assinatura-arrendamento/ Disallow: /it/firma-locazione/ Disallow: /es/firma-alquiler/ Disallow: /ru/podpisanie-dogovora/ Disallow: /el/ypografi-misthosis/ Disallow: /en/after-sales/ Disallow: /de/kundendienst/ Disallow: /pt/pos-venda/ Disallow: /it/post-vendita/ Disallow: /es/posventa/ Disallow: /ru/obsluzhivanie/ Disallow: /el/exypiretisi/ Disallow: /invitation/ # Espace apporteur (lien personnel à jeton) et espace propriétaire dans les # langues ajoutées (lot 7, 02/11/2026, src/lib/referralPaths.ts et # src/lib/ownerPortalPaths.ts). L'espace apporteur n'était interdit dans # aucune langue jusqu'ici. La page de demande d'accès du propriétaire partage # sa racine avec le portail, comme /owner-portal ci-dessus. Disallow: /espace-apporteur/ Disallow: /en/partner-space/ Disallow: /de/partnerbereich/ Disallow: /pt/espaco-do-parceiro/ Disallow: /it/area-partner/ Disallow: /es/espacio-del-colaborador/ Disallow: /ru/kabinet-partnera/ Disallow: /el/choros-synergati/ Disallow: /pt/area-do-proprietario Disallow: /it/area-proprietario Disallow: /es/area-del-propietario Disallow: /ru/kabinet-sobstvennika Disallow: /el/choros-idioktiti # Portefeuilles privés partagés par lien (/p/) — noindex côté page. Disallow: /p/ Disallow: /biens/mon-espace Disallow: /en/properties/my-space Disallow: /de/immobilien/mein-bereich # ----- Back-office, API, authentification ----- Disallow: /api/ Disallow: /strapi-api/ Disallow: /nextimmo-api/ Disallow: /admin Disallow: /admin/ Disallow: /login Disallow: /reset-password # `/private/` (l'espace client lui-même) est bloqué ; `/private` NE L'EST PAS, # et c'est délibéré : cette page-là est LIÉE depuis le héros de toutes les # pages publiques (src/components/elyse/ElyseHero.tsx). Elle porte un # `noindex`, et pour une page liée c'est la bonne configuration — la bloquer # ici empêcherait Google de LIRE ce noindex, et une URL interdite mais liée # peut finir dans l'index SANS contenu (« Indexée malgré le blocage par # robots.txt »). Même raison pour /demande-visite et /apporteur-affaires, qui # ne figurent volontairement nulle part dans ce fichier. Disallow: /private/ # Candidature au Cercle dans les sept autres langues (lot 7, 02/11/2026, # src/lib/privateOfficePaths.ts) : même traitement que /private/candidature. Disallow: /en/private/ Disallow: /de/private/ Disallow: /pt/private/ Disallow: /it/private/ Disallow: /es/private/ Disallow: /ru/private/ Disallow: /el/private/ # ----- Legacy WordPress ----- # Les taxonomies (/region-bien, /ville-propriete, /categorie-action-*, /author, # /category, /tag…) sont 301-redirigées par le worker Cloudflare # (cloudflare-worker/eires-edge.js → legacyRules) et, à défaut, par # LegacyRedirect.tsx. On les LAISSE crawlables : les bloquer empêchait Google # de voir la redirection et de purger ces URLs zombies (audit 360° v2, # 2026-07-12). Seuls l'admin/infra WP et les URLs à paramètres restent bloqués. Disallow: /wp-admin/ Disallow: /wp-content/ Disallow: /wp-includes/ Disallow: /wp-json/ Disallow: /feed/ Disallow: /*?s= Disallow: /*?p= Disallow: /*?attachment_id= # ----- Sitemap + LLM facts ----- Sitemap: https://eires.lu/sitemap.xml Sitemap: https://eires.lu/api/public/fn/perspectives-news-sitemap # Verified canonical facts for LLM grounding (Anthropic/OpenAI llms.txt convention) # https://llmstxt.org # https://eires.lu/llms.txt # https://eires.lu/llms-full.txt (extended: fees, process, FAQ, neighbourhoods)