10.4: Načítání dat JSON z adresy URL (asynchronní zpětná volání!) - výukový program p5.js

Mám jednoduché RewriteRule, připojující řetězec k některým URL:

RewriteRule ^labels/([^/]+)/?$ /labels/$1/releases/ [R=301,L,NC] 

Odkazy jsou řízeny databází a toto funguje velmi dobře. Kromě jednoho z nich. Název obsahuje ?! na konci, řekněme label?!.

Vygenerované odkazy jsou správné, tj .:

/labels/label%3F%21 

Ale přesměrování se použije dvakrát a očividně nepovažuje zakódovaný otazník za součást adresy URL. Výsledný odkaz by měl být:

/labels/label%3F%21/releases/ 

Ale místo toho dostaneme:

/labels/label/releases/?!/releases/ 

Vidím, že pravidlo je ve skutečnosti použito dvakrát, ale jsem si jist, že to lze snadno vyřešit, když překonám svůj první problém: Proč rewriterules vidí kódované %2F jako skutečný oddělovač řetězce dotazu? Jak mohu zmírnit tento případ?

Děkuji za jakoukoli nápovědu!

Potřebujete B příznak uniknout zpětné referenci a the NE (noescape), aby se zabránilo výsledkům substituce (tj. zpětná reference) je dvojnásobně kódována. Například:

RewriteRule ^labels/([^/]+)/?$ /labels/$1/releases/ [B,NE,R=301,L,NC] 

Budete muset vymazat mezipaměť prohlížeče, protože předchozí (chybná) 301 bude uložena do mezipaměti.


Proč rewriterules vidí kódované %2F jako skutečný oddělovač řetězce dotazu?

Mírný překlep, myslím ... myslíte %3F. Ano, nakonec získáte 2 přesměrování, protože ...

  • když o to požádáte /labels/label%3F%21, RewriteRule vzor shody s% -decoded URL-path tj. /labels/label?!. Podle tvého pravidla label?! je poté zkopírován do substituce, což vede k přesměrování na /labels/label?!/releases/ (dále jen ?! automaticky překódováno). Což je cesta URL /labels/label a řetězec dotazu !/releases/. Odtud pochází řetězec dotazu.

  • Na přesměrovanou žádost /labels/label odpovídá vašemu RewriteRule vzor (řetězec dotazu je v této fázi ignorován). Tentokrát jen label je zkopírován do substituce, stát se /labels/label/releases/. Poté je řetězec dotazu z požadavku předán do substituce, což má za následek druhé přesměrování na /labels/label/releases/?!/releases/.

The B vlajka unikne zachycenému vzoru. např. label?! unikl, aby se stal label%3F%21.

A NE příznak brání % kódováno jako %25 (tj. efektivní dvojnásobné kódování zpětné reference). např. label%3F%21 by jinak byl kódován jako label%253F%2521.

Stranou: mod_rewrite automaticky nekóduje První ? v substituce protože se předpokládá, že se tím spustí řetězec dotazu. Následně však ? se automaticky zakóduje. např. Dáno RewriteRule ^foo$ /bar??? [R,L], žádost o /foo má za následek přesměrování na /bar?%3f%3f (všimněte si druhých dvou ? jsou zakódovány URL, ale první není).

  • 1 @JulienEtter místo komentování v tomto smyslu můžete „přijmout“ odpověď pomocí zaškrtnutí v horní části odpovědi. Můžete však přijmout pouze jednu odpověď, pokud máte více užitečných odpovědí, můžete pomocí šipky nahoru hlasovat pro ty dobré. Můžete dokonce hlasovat a přijmout odpověď.

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?