Toon posts:

[PHP] PHP voegt forward slash toe bij 302

Pagina: 1
Acties:

Vraag


  • P.B.
  • Registratie: Juli 2001
  • Niet online
Ik moet content van een webapplicatie parsen binnen een website, en gebruik daarvoor PHP (DOM en XPath), en dat werkt goed.

Echter, een bepaald deel van de applicatie werkt zo: er is een vaste URL die ik kan aanroepen, en de web server geeft dan in een HTTP 302 response, een dynamische URL terug. Nu krijg ik, zowel bij DOM als bij file_get_contents, steeds 400 Bad Request terug.

PHP:
1
2
3
4
$application = "http://10.0.0.5/apex/";
$application_query = "f?p=100:81:8251090794992196::::F123_PJT_ID:341";
$url = $application . $application_query;
echo(file_get_contents($url));


Na een debugging-proxy te hebben geïnstalleerd ben ik achter het volgende gekomen:

PHP vraagt:
code:
1
2
3
GET /apex/f?p=100:81:8251090794992196::::F123_PJT_ID:341 HTTP/1.0
Host: 10.0.0.5
Connection: close

Response web server:
code:
1
2
3
4
5
HTTP/1.0 302 Found
Date: Mon, 24 Sep 2018 00:22:59 GMT
Server: Oracle XML DB/Oracle Database
Location: f?p=100:81:4457738217132505::::F123_PJT_ID:341
Connection: close

PHP vraagt:
code:
1
2
3
GET /apex//f?p=100:81:4457738217132505::::F123_PJT_ID:341 HTTP/1.0
Host: 10.0.0.5
Connection: close

En op die vraag krijgt PHP een 400 bad request terug.
code:
1
2
3
4
5
6
7
8
9
10
11
HTTP/1.0 400 Bad Request
Date: Mon, 24 Sep 2018 00:22:59 GMT
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=UTF-8
Connection: close

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY><H1>Bad Request</H1>
The HTTP client sent a request that this server could not understand.</BODY></HTML>

De fout zit 'm erin dat PHP een tweede slash toevoegt bij de laatste request: /apex//f - terwijl daar een enkele slash moet staan en daardoor komt de bad request. Ik heb het gevalideerd in de web browser en als ik daar een dubbele slash doe krijg ik een bad request, en met een enkele slash krijg ik de content die ik wil.

Is dit een bug van PHP? 8)7 Hoe kan ik dit het beste oplossen? Ik kan de applicatie alleen maar webbased benaderen.

Ik gebruik voor het ontwikkelen van mijn PHP pagina, MAMP op OS X.

Beste antwoord (via P.B. op 24-09-2018 17:52)


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
P.B. schreef op maandag 24 september 2018 @ 02:35:
De fout zit 'm erin dat PHP een tweede slash toevoegt bij de laatste request: /apex//f - terwijl daar een enkele slash moet staan en daardoor komt de bad request. Ik heb het gevalideerd in de web browser en als ik daar een dubbele slash doe krijg ik een bad request, en met een enkele slash krijg ik de content die ik wil.
De fout zat vroeger (voor 2014) eigenlijk in de response:
code:
1
Location: f?p=100:81:4457738217132505::::F123_PJT_ID:341
Officieel moest "Location" een volledige URL zijn.
Echter is dit in 2014 aangepast https://tools.ietf.org/html/rfc7231#section-7.1.2 omdat webbrowsers het ondersteunen.

PHP is aangepast en blijkbaar heeft iemand dus een bug geschreven.

Je kan beter de API aanpassen naar een pre-2014 Location header of de redirect zelf afvangen en verwerken:
PHP:
1
2
3
4
5
6
7
$opts = array('http' =>
    array(
        'follow_location' => 0,
    )
);
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

Maak je niet druk, dat doet de compressor maar

Alle reacties


  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Om zeker te zijn dat een URL goed wordt opgebouwd zou ik gebruik maken van zoiets:
http://php.net/manual/fa/function.http-build-url.php

Ik weet niet of je een framework gebruikt of iets als composer, want er zijn genoeg mooie classes die dit kunnen doen. :)

  • P.B.
  • Registratie: Juli 2001
  • Niet online
HollowGamer schreef op maandag 24 september 2018 @ 06:10:
Om zeker te zijn dat een URL goed wordt opgebouwd zou ik gebruik maken van zoiets:
http://php.net/manual/fa/function.http-build-url.php

Ik weet niet of je een framework gebruikt of iets als composer, want er zijn genoeg mooie classes die dit kunnen doen. :)
Voor zover ik zie in de HTTP headers wordt de URL door mijn code wel goed doorgegeven. Het gaat fout na de 302 redirect. PHP voegt een slash toe aan de URL, terwijl deze niet in het 302 bericht staat.

Acties:
  • Beste antwoord
  • +2Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
P.B. schreef op maandag 24 september 2018 @ 02:35:
De fout zit 'm erin dat PHP een tweede slash toevoegt bij de laatste request: /apex//f - terwijl daar een enkele slash moet staan en daardoor komt de bad request. Ik heb het gevalideerd in de web browser en als ik daar een dubbele slash doe krijg ik een bad request, en met een enkele slash krijg ik de content die ik wil.
De fout zat vroeger (voor 2014) eigenlijk in de response:
code:
1
Location: f?p=100:81:4457738217132505::::F123_PJT_ID:341
Officieel moest "Location" een volledige URL zijn.
Echter is dit in 2014 aangepast https://tools.ietf.org/html/rfc7231#section-7.1.2 omdat webbrowsers het ondersteunen.

PHP is aangepast en blijkbaar heeft iemand dus een bug geschreven.

Je kan beter de API aanpassen naar een pre-2014 Location header of de redirect zelf afvangen en verwerken:
PHP:
1
2
3
4
5
6
7
$opts = array('http' =>
    array(
        'follow_location' => 0,
    )
);
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

Maak je niet druk, dat doet de compressor maar


  • P.B.
  • Registratie: Juli 2001
  • Niet online
DJMaze schreef op maandag 24 september 2018 @ 09:12:
[...]


De fout zat vroeger (voor 2014) eigenlijk in de response:
code:
1
Location: f?p=100:81:4457738217132505::::F123_PJT_ID:341
Officieel moest "Location" een volledige URL zijn.
Echter is dit in 2014 aangepast https://tools.ietf.org/html/rfc7231#section-7.1.2 omdat webbrowsers het ondersteunen.

PHP is aangepast en blijkbaar heeft iemand dus een bug geschreven.

Je kan beter de API aanpassen naar een pre-2014 Location header of de redirect zelf afvangen en verwerken:
PHP:
1
2
3
4
5
6
7
$opts = array('http' =>
    array(
        'follow_location' => 0,
    )
);
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);
De API kan ik niet aanpassen. Ik zal dus de redirect zelf moeten afvangen.
Ik begrijp je PHP code niet (ben niet zo ver gevorderd), dus ik zal daar even op gaan studeren.

Edit: ik begrjip het.

PHP:
1
2
3
4
5
6
7
8
9
10
11
$opts = array('http' =>
    array(
        'follow_location' => 0,
    )
);
$context = stream_context_create($opts);

echo("<pre>");
$headers = get_headers($url, 1, $context);
print_r($headers);
echo("</pre>");


Nu krijg ik in $headers['Location'] de redirect, die ik vervolgens met file_get_contents kan openen.

Many thanks!

[Voor 32% gewijzigd door P.B. op 24-09-2018 17:52]



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee