अपने प्रश्न को पूछें और दस्तावेज़ का सारांश प्राप्त करें, इस पृष्ठ और आपके चुने हुए AI प्रदाता का उपयोग करके
इस पृष्ठ की सामग्री एक AI द्वारा अनुवादित की गई है।
अंग्रेजी में मूल सामग्री के अंतिम संस्करण देखेंअगर आपके पास इस दस्तावेज़ को सुधारने के लिए कोई विचार है, तो कृपया GitHub पर एक पुल अनुरोध सबमिट करके योगदान देने में संकोच न करें।
दस्तावेज़ के लिए GitHub लिंकदस्तावेज़ का Markdown को क्लिपबोर्ड पर कॉपी करें
Hreflang: बहुभाषी SEO के लिए गाइड
आपने अपने ऐप को translate किया। आपने /en, /fr, /es ship किए। और फ्रांसीसी users अभी भी English पेज पर लैंड कर रहे हैं।
अनुवाद करना आसान आधा है। कठिन आधा यह है कि सर्च इंजन को बताया जाए कि ये पेज दूसरी भाषा में एक ही पेज हैं, तीन दस्तावेज़ जो एक-दूसरे के साथ प्रतिस्पर्धा कर रहे हैं। यह वही है जो hreflang करता है, और यह वह जगह है जहां ज्यादातर बहुभाषी साइटें चुप-चाप अपनी ट्रैफिक खो देती हैं।
Hreflang वास्तव में क्या है
एक पेज पर एक एनोटेशन जो कहता है: इस URL के उन भाषाओं के लिए समान संस्करण हैं।
कोड को क्लिपबोर्ड पर कॉपी करें
यह आपको दो चीजें देता है: सही उपयोगकर्ता को सही संस्करण दिखाया जाना, और आपके locales को एक cluster में consolidated करना बजाय duplicates के रूप में एक-दूसरे को cannibalize करने के।
यह स्पष्ट होना महत्वपूर्ण है कि यह क्या नहीं है। यह redirect नहीं है — यह एक hint है, और Google इसे override कर सकता है। यह ranking boost नहीं है — यह बदलता है कौन सा version ranks करता है, न कि क्या आप rank करते हैं। और Bing इसे पूरी तरह ignore करता है, इसके बजाय content-language और geo-targeting पर भरोसा करता है।
इसे कहाँ declare करें
तीन placements, सभी valid हैं। एक चुनें और वहीं रहें — एक ही cluster को दो जगहों पर declare करना यह है कि sets कैसे अलग हो जाते हैं।
HTML <head> सामान्य विकल्प है। एक caveat: hydration के बाद inject किए गए tags unreliable हैं। यदि आपका framework केवल client-side पर उन्हें add करता है, तो crawler उन्हें कभी नहीं देख सकता है।
XML sitemap बड़े पैमाने पर बेहतर है। दस locales को 5,000 pages में फैलाने का मतलब है 50,000 <link> elements को browsers में बेकार भेजना; एक sitemap में इसकी कीमत आपकी pages से शून्य bytes है।
HTTP Link header PDFs जैसी गैर-HTML files के लिए एकमात्र विकल्प है।
नियम
Self-reference और reciprocity
/fr/about पर सेट में hreflang="fr" होना चाहिए जो /fr/about की ओर इशारा करे। और अगर /about /fr/about की ओर इशारा करता है, तो /fr/about को वापस इशारा करना चाहिए। Google एकतरफा reference को "no return tag" कहता है और इसे drop कर देता है।
व्यावहारिक रूप से इसका मतलब है कि एक cluster में प्रत्येक page identical links का सेट भेजता है। उन्हें एक shared locale list से generate करना सुविधा नहीं है, यह सही रहने का एकमात्र तरीका है एक बार जब आपके पास दो से अधिक locales हों।
Absolute URLs, हमेशा
कोड को क्लिपबोर्ड पर कॉपी करें
इसका कारण समझना महत्वपूर्ण है बजाय इसे याद रखने के। hreflang एक cross-document reference है: search engines एक cluster बनाते हैं जो URL से keyed होता है, इसमें शामिल हर page में साझा किया जाता है। एक relative path का केवल उस document के सापेक्ष अर्थ है जिसमें यह बैठा है, इसलिए यह इसे express नहीं कर सकता। यह एक host को भी cross नहीं कर सकता — और एक alternate अक्सर ऐसा करता है, जब एक locale example.fr या fr.example.com पर रहता है। एक sitemap या एक HTTP header में resolve करने के लिए कोई base document नहीं है।
इसका कोड में सीधा प्रभाव पड़ता है। getLocalizedUrl("/about", "fr") /fr/about देता है — relative in, relative out। hreflang के लिए आपको इसे एक absolute URL देना चाहिए:
कोड को क्लिपबोर्ड पर कॉपी करें
एक अपवाद है एक framework जो rendering से पहले relative values को आपके लिए resolve करता है: Next.js relative alternates को metadataBase के विरुद्ध expand करता है। ठीक है — लेकिन नियम emitted HTML पर लागू होता है, इसलिए curl के साथ जांच करें, DevTools inspector नहीं।
भाषा कोड
ISO 639-1 भाषा के लिए, ISO 3166-1 Alpha 2 optional region के लिए: fr, fr-CA, pt-BR।
दो समस्याएं लगभग सभी को पकड़ती हैं। केवल एक region अमान्य है — hreflang="ca" कातालान है, कनाडा नहीं; आपको en-CA या fr-CA की आवश्यकता है। और en-UK मौजूद नहीं है: यूनाइटेड किंगडम के लिए country code GB है, इसलिए यह en-GB है।
केवल तभी एक region जोड़ें जब आप वास्तव में उस region को अलग content provide करते हों — अलग कीमतें, अलग कानूनी नोटिस। fr और fr-FR समान content पर शोर है।
x-default
कोड को क्लिपबोर्ड पर कॉपी करें
एक अवधारणा जो सबसे अधिक भूली हुई है, और गलत तरीके से समझी जाती है, वह है x-default — 30% से भी कम apps इसे सही तरीके से लागू करते हैं।
यह उन उपयोगकर्ताओं के लिए fallback है जिनकी भाषा आपके सेट में किसी भी चीज़ से मेल नहीं खाती। एक डच भाषी व्यक्ति एक ऐसी साइट पर जो अंग्रेजी, फ्रेंच और स्पेनिश प्रदान करती है, किसी भी प्रविष्टि से मेल नहीं खाता; बिना x-default के, Google आपके लिए चुनता है।
लोग इसका मतलब गलत समझते हैं। x-default "अंग्रेजी संस्करण" नहीं है और "डिफॉल्ट locale" नहीं है, भले ही यह आमतौर पर वहां इशारा करता है। इसका मतलब है उन उपयोगकर्ताओं के लिए पृष्ठ जिन्हें यह सेट cover नहीं करता। यही कारण है कि यह legitimate है — और अक्सर बेहतर है — इसे /en के बजाय एक language-selector या geo-redirecting landing page पर इशारा करना। यदि आपके पास ऐसा कोई पृष्ठ नहीं है, तो आपकी primary language एक sensible उत्तर है।
दो चीजें स्पष्ट रखने के लिए: x-default सेट में एक अतिरिक्त entry है, self-referencing वाले की जगह नहीं, और हर दूसरी entry की तरह इसे cluster के हर पेज पर identically दिखना चाहिए।
कैनोनिकल ट्रैप
प्रत्येक localized पेज अपना खुद का canonical होना चाहिए:
कोड को क्लिपबोर्ड पर कॉपी करें
हर locale के canonical को English version की ओर इंगित करना इसके बजाय:
कोड को क्लिपबोर्ड पर कॉपी करें
कहता है कि फ्रेंच पेज एक डुप्लिकेट है जिसे इंडेक्स नहीं किया जाना चाहिए, जबकि hreflang कहता है कि यह फ्रेंच उपयोगकर्ताओं को परोसने के लिए पेज है। सिग्नल विरोधाभासी हैं, canonical जीतता है, और आपके फ्रेंच पेज इंडेक्स से बाहर निकल जाते हैं।
Canonical स्व-संदर्भी है प्रति लोकेल। hreflang क्लस्टर का वर्णन करता है।
URL संरचना चुनना
hreflang URLs को एनोटेट करता है, इसलिए संरचना पहले आती है।
सभी डेटा सामग्री को स्पष्ट रूप से देखने के लिए तालिका को मोडल में खोलें
| संरचना | उदाहरण | Trade-off |
|---|---|---|
| Subdirectories | example.com/fr/ | एक डोमेन, साझा authority — कमजोर geo-signal |
| Subdomains | fr.example.com | लोकेल जोड़ना या हटाना आसान — अलग साइट के रूप में पढ़ा जा सकता है |
| ccTLDs | example.fr | सबसे मजबूत देश संकेत — प्रत्येक domain के लिए authority बनाई गई |
Subdirectories अधिकांश projects के लिए सही default हैं। ccTLDs तक केवल तब पहुंचें जब आप वाकई अलग-अलग देशों के businesses के रूप में काम कर रहे हों।
एक structure जिससे बचना है: same URL पर विभिन्न languages को Accept-Language या IP के आधार पर serve करना। Crawlers एक version देखते हैं और एक version को index करते हैं; बाकी सब अदृश्य है।
Intlayer तीनों कोrouting.modeऔरrouting.domainsके माध्यम से cover करता है। custom domains और configuration reference देखें।
Implementation
इन टैग्स को हाथ से लिखना दूसरे locale के साथ संपर्क में नहीं टिकता। इसके बजाय उन्हें अपनी locale सूची से प्राप्त करें।
हर पेज पर cluster emit करें
हर जगह एक ही सेट, हर locale के लिए canonical, absolute URLs,
x-defaultशामिल।Metadata API
alternates.languagesको expose करता है, औरgetMultilingualUrlsआपकी configured locales से पूरा record बनाता है:src/app/[locale]/about/page.tsxकोड कॉपी करेंकोड को क्लिपबोर्ड पर कॉपी करें
पूरा सेटअप: Next.js 16 i18n guide.
route का
headफ़ंक्शन links को बनाता है।localeMapआपके कॉन्फ़िगर किए गए locales को iterate करता है, इसलिए config में एक locale जोड़ने से यह सभी जगह एक साथ जुड़ जाता है:src/routes/{-$locale}/about.tsxकोड कॉपी करेंकोड को क्लिपबोर्ड पर कॉपी करें
headसर्वर पर चलता है, इसलिए टैग प्रारंभिक HTML में आते हैं। पूर्ण सेटअप: TanStack Start i18n guide।या इसे सभी को sitemap में स्थानांतरित करें
बड़े पैमाने पर, annotations को अपने pages से पूरी तरह बाहर रखें।
generateSitemapप्रत्येक entry के लिएxhtml:linkalternates emit करता है, अपने config से locales और routing mode को पढ़ता है:src/routes/sitemap[.]xml.tsकोड कॉपी करेंकोड को क्लिपबोर्ड पर कॉपी करें
दो विकल्प जानने लायक हैं:
xhtmlLinks(डिफ़ॉल्टtrue) — alternates केवल वहीं emit किए जाते हैं जहां locale URLs वास्तव में भिन्न होते हैं।no-prefixमोड में हर locale एक ही URL साझा करता है, इसलिए वे तब तक छोड़ दिए जाते हैं जब तकrouting.domainslocales को उनके अपने hostnames नहीं देता।entryPerLocale(defaultfalse) — डिफ़ॉल्ट रूप से एक<url>entry सभी alternates को ले जाता है। दोनों forms वैध हैं, लेकिन केवल एक URL जो<loc>के रूप में listed है वह Search Console में submitted के रूप में गिना जाता है; alternate-only locales discoverable रहते हैं लेकिन किसी भी sitemap को attributed नहीं होते। इसे चालू करने से हर localized URL को अपना entry मिलता है जिसमें पूरा alternate set दोहराया जाता है। यह entries को locale count से गुणा करता है, इसलिए 50,000 URL / 50 MB limit को देखें और इससे आगे sitemap index में विभाजित करें।
Verify करें कि crawler क्या प्राप्त करता है
hreflangsilently fail होता है, इसलिए इसे assume करने की बजाय check करें।स्रोत को पढ़ें, इंस्पेक्टर को नहीं —
curl https://example.com/fr/about | grep hreflangदिखाता है कि एक crawler को क्या मिलता है; DevTools JavaScript चलने के बाद DOM दिखाता है। फिर प्रत्येक alternate को follow करें और पुष्टि करें कि यह समान set के साथ वापस इंगित करता है, और कि उनमें से कोई भी redirect नहीं करता है। Search Console की International Targeting report पूरी साइट में बाकी को पकड़ता है।एक multilingual-specific crawl के लिए, Intlayer SEO Scanner आपके localized pages में missing tags, broken alternates, और canonical conflicts की जांच करता है।
Checklist
- प्रत्येक locale के पास एक distinct, crawlable URL है
- हर page self-references करता है, और हर reference reciprocal है
- समान set cluster में हर page पर ship होता है
- सभी
hrefvalues emitted HTML में absolute हैं - Codes ISO 639-1 + ISO 3166-1 Alpha 2 हैं (
en-GB,en-UKनहीं) -
x-defaultpresent है, और यह दर्शाता है कि unmatched users को कहाँ जाना चाहिए - Canonical प्रत्येक locale के लिए self-referential है
- Tags server-rendered हैं, hydration के बाद inject नहीं किए गए
- बिल्कुल एक जगह declared हैं
- कोई alternate redirects नहीं
निष्कर्ष
hreflang सरल और unforgiving है। एक missing return tag, एक relative URL, एक cross-locale canonical, और cluster को बिना किसी error के discard कर दिया जाता है। ये सभी tags को manually लिखने से आते हैं।
एक एकल locale list से set प्राप्त करें, इसे server-side पर render करें, canonical को self-referential रखें, और x-default को वह विचार दें जिसके लायक है। ऐसा एक बार करें और correctness कुछ ऐसी चीज़ बन जाएगी जिसे आप maintain नहीं करते हैं।
आगे बढ़ना
- SEO और Internationalization — व्यापक multilingual SEO चित्र
- SEO और i18n in Next.js —
next-intlvsnext-i18nextvs Intlayer - Next.js 16 i18n guide
- TanStack Start i18n guide
- Custom domains per locale
- Configuration reference
टिप्पणियाँ
अभी तक कोई टिप्पणी नहीं। अपने विचार साझा करने वाले पहले व्यक्ति बनें।
