HTTP रीडायरेक्ट

HTTP redirect ऐसा response है जिसमें 3xx status code और एक Location header होता है जो दूसरा URL बताता है। Browser इसे अपने-आप follow करता है, वहाँ नई request भेजता है और सिर्फ़ आख़िरी page दिखाता है। उदाहरण के लिए, GET http://shop.example.com/sale का जवाब 301 Moved Permanently और Location: https://shop.example.com/offers हो सकता है; फिर browser वह address request करता है और 200 OK पाता है।

रोज़ का काम पाँच codes करते हैं: 301, 302, 303, 307 और 308। ये दो सवालों पर अलग हैं: क्या move permanent है, और redirect follow करते समय क्या client POST को GET में बदल सकता है?

यह क्यों ज़रूरी है

Redirects अहम रास्तों पर होते हैं: HTTP से HTTPS, redesign के बाद पुराने links, login और logout, payment से वापसी, API version बदलना। कोई redirect गलत हो तो लक्षण उलझाने वाले होते हैं: form का data खो जाना क्योंकि POST, GET बन गया; ऐसा page जो browser के हार मानने तक redirect करता रहे; पुराने links जो 404 पर ख़त्म हों; या गलत permanent redirect जिसे browser fix के बाद भी follow करता रहे, क्योंकि उसने उसे cache कर लिया।

Redirects security का विषय भी हैं: जो application किसी parameter में आए किसी भी URL पर redirect करता है, वह किसी को भी आपके भरोसेमंद domain पर ऐसा link बनाने देता है जो phishing page पर पहुँचाए। Browser redirects चुपचाप follow करता है, इसलिए ये defects तब तक छिपे रहते हैं जब तक tester हर hop न देखे।

पाँच codes, दो सवाल

RFC 9110 redirect codes परिभाषित करता है। Permanent (301, 308) का मतलब है कि resource को नया permanent URL मिल गया है और आगे के सभी references उसी को इस्तेमाल करें: search engines और दूसरे crawlers अपने links उस पर update कर लेते हैं, और caches redirect को caching headers के बिना भी store कर सकते हैं। Temporary (302, 307) का मतलब है original URL valid रहता है। 303 दोनों में से कोई नहीं: यह ऐसे दूसरे resource की ओर इशारा करता है जिसमें इस request का जवाब है। Temporary codes और 303 सिर्फ़ तभी cache होते हैं जब caching headers इसकी अनुमति दें।

Method के बारे में RFC 9110 कहता है कि ऐतिहासिक कारणों से client 301 या 302 follow करते समय POST को GET में बदल सकता है, और browsers Fetch Standard के तहत यही करते हैं, body हटाकर। 307 और 308 इसकी इजाज़त नहीं देते: client को वही method उसी body के साथ दोहराना होता है।

  • 301 Moved Permanently: permanent; POST, GET बन सकता है। हमेशा के लिए move हुए pages के लिए।
  • 302 Found: temporary; POST, GET बन सकता है। छोटे detour के लिए, जैसे login page पर भेजना।
  • 303 See Other: अगली request GET होती है (HEAD, HEAD ही रहता है)। Form POST के बाद result page के लिए (Post/Redirect/Get), ताकि refresh करने पर form दोबारा submit न हो।
  • 307 Temporary Redirect: temporary; method और body वही रहते हैं। POST endpoint के temporary move के लिए।
  • 308 Permanent Redirect: permanent; method और body वही रहते हैं। हमेशा के लिए move हुए API endpoint के लिए।
  • 304 Not Modified भी 3xx code है, पर यह client को किसी नए URL पर नहीं भेजता: इसमें Location नहीं होता, और यह conditional request के बाद client से अपनी cached copy दोबारा इस्तेमाल करने को कहता है (RFC 9110 इसे पहले से stored result पर redirection कहता है), जैसा caching वाले lesson में देखा।
पाँच redirect codes में 301 और 308 permanent हैं और default रूप से cacheable हैं, और सिर्फ़ 307 और 308 गारंटी देते हैं कि redirected POST अपनी body के साथ फिर से POST के रूप में भेजा जाए।
CodePermanent या temporaryPOST के बाद अगली requestDefault रूप से cacheablecaching headers के बिनाआम इस्तेमाल
301Moved PermanentlyPermanentGET बन सकता है, body हट जाती हैहाँहमेशा के लिए move हुआ page
302FoundTemporaryGET बन सकता है, body हट जाती हैनहींछोटा detour, जैसे login page पर
303See Otherकोई नहीं: जवाब की ओर इशाराहमेशा GET, body हट जाती हैनहींForm POST के बाद result page
307Temporary RedirectTemporaryफिर से POST, वही bodyनहींPOST endpoint का temporary move
308Permanent RedirectPermanentफिर से POST, वही bodyहाँहमेशा के लिए move हुआ API endpoint
  • Method और body वही रहते हैं

आज़माएँ: HTTP स्टेटस कोड लुकअप

Worked example: redirect में खोया order

यह defect आप HTTP status codes वाली exercise में row R8 के रूप में देख चुके हैं: ऐप ने 301 को GET से follow किया और chain एक भ्रामक 200 पर ख़त्म हुई। यहाँ देखें कि browser में यह एक-एक hop पर कैसा दिखता है। एक web shop अपनी order API को /api/v1/orders से /api/v2/orders पर ले जाता है और customers के browsers में अभी भी खुले pages के लिए पुराने path से 301 जोड़ देता है। फिर वे customers "Place order" दबाते हैं और "Something went wrong" देखते हैं। DevTools में "Preserve log" चालू करने पर Network panel एक click के लिए दो requests दिखाता है (इस section के अंत का trace)।

Browser ने 301 को वैसे follow किया जैसा Fetch Standard POST के लिए कहता है: उसने body के बिना GET भेजा, और page ने सिर्फ़ आख़िरी 405 देखा। Bug report दोनों hops लिखती है और संभावित कारण बताती है: 308 की जगह 301। Fix के बाद confirmation test जाँचता है कि POST अपनी body के साथ v2 तक पहुँचे, 201 Created लौटाए और ठीक एक order बने।

Browser के बाहर, curl -i redirect response ख़ुद दिखाता है, क्योंकि curl redirects सिर्फ़ -L के साथ follow करता है; Redirect Checker किसी public URL का हर hop दिखाता है, और हर hop GET से request करता है। हर redirect में जाँचें:

  • Status: requirement को जो exact code चाहिए, सिर्फ़ कोई भी 3xx नहीं।
  • Location: सही target, https पर, ज़रूरत हो तो path और query string बनाए रखते हुए (/old?id=7 → /new?id=7)।
  • Hops: जितने कम हो सकें, बेहतर हो तो एक।
  • End: अपेक्षित page या resource, 404 या login page नहीं।
  • Method और body: redirected POST के बाद असल में क्या पहुँचा।
--- request 1 (the click) ---
POST /api/v1/orders HTTP/1.1
Host: shop.example.com
Content-Type: application/json

{"sku":"A-100","qty":2}

HTTP/1.1 301 Moved Permanently
Location: /api/v2/orders

--- request 2 (sent by the browser: method changed, body dropped) ---
GET /api/v2/orders HTTP/1.1
Host: shop.example.com

HTTP/1.1 405 Method Not Allowed
Allow: POST

आज़माएँ: cURL जनरेटर आज़माएँ: HTTP हेडर पार्सर

Redirect chains और loops

Redirect chain लगातार कई redirects हैं: http://example.com/shoes → https://example.com/shoes → https://www.example.com/shoes → https://www.example.com/shoes/। हर hop एक extra round trip है और एक और rule जो टूट सकता है। Chains परतों में बढ़ती हैं: load balancer HTTPS पर upgrade करता है, web server www जोड़ता है, application trailing slash जोड़ता है। इसकी जगह हर पुराना URL सीधे अपने final address पर भेजें।

Redirect loop ऐसी chain है जो कभी ख़त्म नहीं होती। Browsers हार मान लेते हैं (Fetch Standard 20 redirects पर रुक जाता है) और Chrome में ERR_TOO_MANY_REDIRECTS जैसा error दिखाते हैं। Loops दो ऐसे components से बनते हैं जो आपस में असहमत हों:

  • Proxy या load balancer request HTTPS पर लेता है पर application को plain HTTP पर आगे भेजता है; application भी HTTPS ज़रूरी करता है, उसे HTTP दिखता है और वह हर request पर फिर उसी https address पर redirect कर देता है।
  • Web server trailing slash जोड़ता है और application उसे हटा देता है।
  • Login page signed-in users को dashboard पर भेजता है, और dashboard जिन्हें signed-out मानता है उन्हें वापस login पर भेजता है, जैसे इसलिए कि session cookie किसी दूसरे domain या path के लिए set हुई थी।

आज़माएँ: रीडायरेक्ट चेकर

Open redirect का जोखिम

कई applications request से लिए गए URL पर redirect करते हैं: login के बाद ?next=/orders/15 user को उस page पर लौटाता है जो वह चाहता था। अगर कोई भी value मान ली जाए, तो https://shop.example.com/login?next=https://example.org/ users को आपके भरोसेमंद domain से किसी भी site पर भेज देता है। यह open redirect है, जिसे unvalidated redirect भी कहते हैं, और attackers इसे phishing में इस्तेमाल करते हैं क्योंकि link आपके असली domain से शुरू होता है।

Unvalidated redirects पर OWASP cheat sheet सलाह देती है कि user के दिए targets से बचें, server पर रखे URL से एक छोटी id map करें, या target को allow-list से जाँचें। सिर्फ़ वही systems टेस्ट करें जो आपके हों या जिनकी लिखित अनुमति हो, test environment में, और बाहरी target के रूप में reserved domain example.org रखें। नीचे की हर value parameter में आज़माएँ; expected result हमेशा आपकी अपनी site का कोई page या safe default है।

  • Absolute URL: https://example.org/।
  • Protocol-relative URL, जिसे browser बाहरी मानता है: //example.org/।
  • आपके domain से शुरू होने वाला lookalike: https://shop.example.com.example.org/।
  • @ से पहले user info के रूप में आपका domain, जो फिर भी example.org पर ले जाता है: https://shop.example.com@example.org/।
  • दूसरी जगहें: returnUrl या redirect जैसे parameters, logout और payment-return pages।

आज़माएँ: URL पार्सर

आम गलतियाँ

  • सिर्फ़ address bar में आख़िरी page देखना, बीच के hops, codes और Location values कभी नहीं।
  • किसी भी 3xx को pass मान लेना: 301 या 302 तय करता है कि move permanent है या नहीं, और 302 या 307 कि POST अपनी body रखेगा या नहीं।
  • Fix हुए permanent redirect को ऐसे browser में दोबारा टेस्ट करना जिसने पुराना redirect cache कर रखा है। Clean profile या curl इस्तेमाल करें।
  • सिर्फ़ नए visitor की तरह टेस्ट करना, जबकि loops अक्सर मौजूदा session, language cookie या किसी ख़ास starting URL के साथ ही दिखते हैं।
  • Open redirect को हानिरहित मानकर छोड़ देना, या reserved domain की जगह असली third-party sites पर उसे आज़माना।

QA का नज़रिया

हर उस बदलाव में redirects आते हैं जो URL बदलता है: redesign, नया API version, domain या HTTPS move। Redirect map माँगें (पुराना URL, नया URL, status code, query string रखी जाएगी या नहीं) और उसे data-driven test में बदलें, हर पुराने URL की एक row के साथ। Deploy के बाद उसे फिर चलाएँ, क्योंकि CDN और server rules अक्सर environments के बीच अलग होते हैं।

Redirect bug report में हर hop को उसके method, URL, status और Location के साथ लिखें, और बताएँ कि hops किस rule की ओर इशारा करते हैं, एक hypothesis के रूप में जिसे team confirm करे। Open redirect को अपनी team की security defects वाली process से report करें।

अभ्यास

तीन redirect traces की review करें

आपका काम

एक site migration की दो requirements हैं। R1: हर पुराना URL एक ही permanent redirect से, HTTPS पर, query string बनाए रखते हुए अपने नए page तक पहुँचे। R2: sign-in के बाद user ?next= वाले page पर लौटे, जो इसी site का होना चाहिए। नीचे trace C एक test account से सफल sign-in है।

तय करें कि हर trace requirements पूरी करता है या नहीं; जो trace fail हो, उसके लिए expected trace और एक line का bug title लिखें।

सामग्री
Trace A   GET http://example.com/sale?src=mail
  301     Location: https://example.com/sale?src=mail
  301     Location: https://www.example.com/sale?src=mail
  302     Location: https://www.example.com/offers
  200     OK

Trace B   GET https://www.example.com/help
  301     Location: https://www.example.com/help/
  301     Location: https://www.example.com/help
  301     Location: https://www.example.com/help/
  ...     ERR_TOO_MANY_REDIRECTS

Trace C   POST https://www.example.com/login?next=https://example.org/
  303     Location: https://example.org/
चरण
  1. हर trace में hops गिनें।
  2. हर status code को R1 और R2 से मिलाएँ।
  3. हर Location जाँचें: scheme, host, path और query string।
  4. Verdict, expected trace और bug title लिखें।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

Trace A तीन तरह से R1 fail करता है: एक की जगह तीन hops, अंत में temporary 302, और उसी hop पर query string src=mail खो जाना। Expected: http://example.com/sale?src=mail → 301 → https://www.example.com/offers?src=mail → 200। Title: "पुराना /sale URL: तीन redirects, आख़िर में 302, query string गायब"।

Trace B loop है: एक rule trailing slash जोड़ता है, दूसरा हटाता है, इसलिए help page तक पहुँचा नहीं जा सकता। Expected: एक canonical form, जिस तक ज़्यादा से ज़्यादा एक 301 से पहुँचा जाए। Title: "/help पर redirect loop: trailing slash बारी-बारी से जुड़ता और हटता है"।

Trace C, R2 fail करता है: यह open redirect है। Login POST के बाद 303 सही है; defect target में है। Expected: बाहरी value reject हो और user /account जैसे default page पर पहुँचे। इसे security defect के रूप में report करें।

अक्सर पूछे जाने वाले सवाल

302 और 307 में क्या फ़र्क़ है?

दोनों temporary हैं। 302 follow करते समय client POST को GET में बदल सकता है, और browsers ऐसा करते हैं; 307 में उसे वही method और वही body दोहरानी होती है। GET request के लिए दोनों एक जैसा व्यवहार करते हैं।

301 इस्तेमाल करूँ या 308?

जिन pages को सिर्फ़ GET से request किया जाता है, उनके लिए दोनों चलते हैं, और 301 लंबे समय से आम choice है। POST लेने वाले API endpoint या form के लिए 308 इस्तेमाल करें, ताकि method और body वही रहें।

Chrome DevTools 307 Internal Redirect क्यों दिखाता है जबकि मेरा server 301 भेजता है?

क्योंकि browser ने request भेजने से पहले उसे ख़ुद redirect किया, जैसे इसलिए कि site HSTS इस्तेमाल करती है और browser http को अपने-आप https पर upgrade कर देता है। यह row server का response नहीं है। Server असल में क्या लौटाता है, यह देखने के लिए curl या Redirect Checker इस्तेमाल करें।

संदर्भ

  • RFC 9110: HTTP SemanticsIETF · 2022HTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
  • Fetch StandardWHATWGCORS को परिभाषित करता है: प्रीफ़्लाइट रिक्वेस्ट, Access-Control-* हेडर और कौन-से रिस्पॉन्स ब्राउज़र पेज को दिखा सकता है।
  • OWASP Cheat Sheet Series: Unvalidated Redirects and ForwardsOWASP FoundationOpen redirects: redirect का गंतव्य उपयोगकर्ता के input से क्यों नहीं आना चाहिए, और बचाव — server पर identifiers को URLs से जोड़ना, allow-lists और पुष्टि पेज।
  • Redirections in HTTP — MDNMDN Web Docs (Mozilla)HTTP redirects: Location header के साथ 3xx status codes, स्थायी (301, 308) बनाम अस्थायी (302, 303, 307), और redirect loops कैसे बनते हैं।

Mutqan tools से अभ्यास करें

रीडायरेक्ट चेन (301/302/307/308) ट्रेस करें और हर हॉप, स्टेटस तथा अंतिम URL देखें।

वेब

किसी भी HTTP स्टेटस कोड का अर्थ, RFC संदर्भ और उसे कब इस्तेमाल करना है — सब एक जगह देखें।

वेब

मेथड, URL, हेडर, बॉडी और auth विकल्पों से cURL कमांड बनाएँ।

वेब

कच्चे HTTP रिक्वेस्ट/रिस्पॉन्स हेडर को व्याख्या सहित एक संरचित तालिका में बदलें।

वेब

किसी URL को protocol, host, port, path, क्वेरी पैरामीटर, fragment और क्रेडेंशियल में तोड़ें।

वेब

और गहराई से

इस topic में आपकी प्रगति

QA रोडमैप का हिस्सा