10.4: Indlæsning af JSON-data fra en URL (Asynkrone tilbagekald!) - Vejledning til p5.js

Jeg har en simpel RewriteRule, der tilføjer en streng til nogle URL'er:

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

Links er databasestyrede, og dette fungerer meget godt. Bortset fra en af ​​dem. Navnet indeholder ?! i slutningen, lad os sige label?!.

De genererede links er korrekte, dvs.

/labels/label%3F%21 

Men omdirigering anvendes to gange og betragter naturligvis ikke det kodede spørgsmålstegn som en del af URL'en. Det resulterende link skal være:

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

Men vi får i stedet:

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

Jeg kan se, at reglen faktisk anvendes to gange, men jeg er sikker på, at dette let kan løses, hvis jeg kommer over mit første problem: Hvorfor ser omkriterier det kodede %2F som en egentlig afgrænsning af forespørgselsstreng? Hvordan kan jeg mildne denne sag?

Tak for ethvert tip!

Du har brug for B flag for at undslippe backreference og det NE (noescape) for at forhindre det resulterende udskiftning (dvs. backreference) er dobbelt kodet. For eksempel:

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

Du bliver nødt til at rydde din browsercache, da den forrige (fejlagtige) 301 er blevet cache.


Hvorfor ser omkriterier kodet %2F som en egentlig afgrænsning af forespørgselsstreng?

Let skrivefejl der tror jeg ... du mener %3F. Ja, du får to omdirigeringer, fordi ...

  • når du beder om det /labels/label%3F%21, det RewriteRule mønster matches mod den% -kodede URL-sti, dvs. /labels/label?!. I henhold til din regel, label?! kopieres derefter til udskiftningen, hvilket resulterer i en omdirigering til /labels/label?!/releases/ (det ?! kodes ikke automatisk igen). Hvilket er en URL-sti til /labels/label og en forespørgselsstreng af !/releases/. Det er her forespørgselsstrengen kommer fra.

  • På den omdirigerede anmodning /labels/label matcher din RewriteRule mønster (forespørgselsstrengen ignoreres på dette stadium). Denne gang bare label kopieres til udskiftning, at blive /labels/label/releases/. Og så sendes forespørgselsstrengen fra anmodningen til udskiftningen for at resultere i en anden omdirigering til /labels/label/releases/?!/releases/.

Det B flag undgår det fangede mønster. f.eks. label?! er undsluppet at blive label%3F%21.

Og NE flag forhindrer % bliver kodet som %25 (dvs. effektiv dobbeltkodning af backreference). f.eks. label%3F%21 ellers ville være kodet som label%253F%2521.

Bortset fra: mod_rewrite koder ikke automatisk for først ? i udskiftning da det antages, starter forespørgselsstrengen. Imidlertid efterfølgende ? bliver automatisk kodet. f.eks. Givet RewriteRule ^foo$ /bar??? [R,L], en anmodning om /foo resulterer i en omdirigering til /bar?%3f%3f (bemærk de to andre ? er URL-kodede, men den første er ikke).

  • 1 @JulienEtter i stedet for at kommentere det, kan du "acceptere" svaret ved hjælp af fluebenet øverst i svaret. Du kan dog kun acceptere et svar. Hvis du har flere nyttige svar, kan du bruge pilen "op" til at opstemme de gode. Du kan endda opstemme og acceptere et svar.

arbejdet for dig: Charles Robertson | Ønsker du at kontakte os?