NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Predvolene vypnuté: presmerovanie sa vráti volajúcemu bez sledovania. Zapnete ich pre jedno volanie alebo v konfigurácii (redirects.enabled):

use RoundlyConsulting\SafeFetch\DataTransferObjects\RedirectPolicy;

Http::safe(SafeFetch::policy()->followRedirects())->post($url, $payload);            // 307/308, ≤ 3 hops
Http::safe(SafeFetch::policy()->redirects(RedirectPolicy::methodPreserving(5)))->post($url, $payload);
Http::safe(SafeFetch::policy()->redirects(RedirectPolicy::methodPreserving(3, forwardHeaders: ['webhook-signature'])))
    ->post($url, $payload);

RedirectPolicy

Nemenné — každá with-metóda vráti kópiu so zmeneným jedným nastavením a ostatné ponechá:

PolePredvolenéVýznam
enabledfalseČi sa presmerovania vôbec sledujú.
max3Najviac sledovaných krokov, 0–10 → too_many_redirects.
statusesnullnull: 307 a 308; inak neprázdna podmnožina 301, 302, 303, 307, 308.
allowDowngradefalsehttps → http (pravidlá musia povoliť aj http) → inak redirect_downgrade.
forwardHeaders[]Názvy hlavičiek, prevedené na malé písmená a overené, ktoré idú aj na iný origin.
statusesGiven—Či boli stavy zadané alebo predvolené — fetch() a download() rozšíria predvolenú množinu na všetkých päť.
MetódaČo robí
RedirectPolicy::none()Presmerovania sa vrátia volajúcemu, nikdy sa nesledujú.
RedirectPolicy::methodPreserving(int $max = 3, array $forwardHeaders = [])Sleduje 307 a 308 (metóda a telo sa zachovajú), najviac $max krokov, a pomenované hlavičky pošle aj na iný origin.
enabled(bool $enabled = true, ?int $max = null)Tie isté pravidlá, sledované alebo nie.
withStatuses(array $statuses)Sledovať presne tieto stavy.
forwardHeaders(array $headers)Nahradí zoznam preposielaných hlavičiek. Prihlasovacie údaje nejdú nikdy: uveďte len hlavičky, ktoré je bezpečné zopakovať.
allowingDowngrade(bool $allow = true)Sledovať https → http alebo nie.
max(int $max)Najviac $max krokov, 0–10.
follows(int $status)Či sa odpoveď so stavom $status a hlavičkou Location sleduje.
$redirects = RedirectPolicy::methodPreserving(3)
    ->withStatuses([301, 302, 303, 307, 308])   // follow all five
    ->forwardHeaders(['webhook-signature'])     // replaces the list
    ->max(5);                                   // 0–10

RedirectPolicy::none();                          // returned unfollowed — the default
$redirects->follows(302);                        // true

Keď sú presmerovania zapnuté

  • Ktoré stavy: predvolene 307 a 308 (metóda a telo sa zachovajú). Pravidlá môžu určiť ľubovoľnú podmnožinu 301, 302, 303, 307 a 308; fetch() a download() (len GET) sledujú všetkých päť, ak pravidlá žiadne neurčia.
  • 301 a 302 po POST a 303 po čomkoľvek okrem HEAD prepnú na GET a zahodia telo aj jeho hlavičky Content-*. Každé iné sledované presmerovanie zachová metódu; ak telo posiela znovu, najprv ho pretočí na začiatok, a telo, ktoré sa pretočiť nedá, nechá presmerovanie vrátené bez sledovania.
  • Každý krok sa overí a pripne znovu, presne ako prvý; odmietnutie reťaz zastaví.
  • Najviac max krokov (0–10, predvolene 3) → too_many_redirects.
  • https → http len pri zapnutom allowDowngrade (a ak pravidlá povoľujú http); inak redirect_downgrade.
  • Jeden časový rozpočet pokrýva všetky kroky.
  • Location sa rieši podľa RFC 3986 §5.2 voči prestavanej URL (SafeFetch::urls()->resolveRedirect()); relatívna hodnota so spätnou lomkou alebo riadiacim znakom sa odmietne (invalid_url).
  • Sledované presmerovanie sa posudzuje len podľa stavu a Location — prenos skončí pred jeho telom.
  • Hlavičky len na prvý origin. Krok na iný origin (schéma, hostiteľ alebo port) nesie len Accept, Accept-Encoding, Accept-Language, Content-Type, Content-Length, Content-Encoding, User-Agent a forwardHeaders z pravidiel. Voľba auth, HTTPAUTH / USERPWD z curl (digest, NTLM) a digest stav Guzzle sa zahodia tiež (CVE-2022-31090) a zostanú zahodené, aj keď sa neskorší krok vráti na prvý origin.
  • Cookies pri každom kroku: každý krok pošle cookies z úložiska pre vlastnú URL a každá odpoveď uloží svoje Set-Cookie k požiadavke, ktorá ju dostala — stránka, na ktorú bola požiadavka presmerovaná, nemôže nastaviť cookies pre tú prvú. withOptions(['cookies' => false]) cookies vypne.
  • Záznamník Laravelu zaznamená každý krok, takže Http::assertSentCount() počíta kroky.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.