Toon posts:

[PHP] Vreemde 'refresh' bij header(Location) op IIS

Pagina: 1
Acties:

Onderwerpen

Vraag


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
Ik loop tegen een vreemd probleem aan bij het gebruik van PHP op IIS waar ik niet uitkom. Ik heb inmiddels een aardige workaround gevonden maar ik zou toch graag willen weten waar het aan ligt...

In mijn webapplicatie wordt er op allerlei plekken gepost en (afhankelijk van wat er waar wordt gepost) wordt een user nog wel eens naar een andere pagina teruggeleid. Ik los dat op door een sessie-variabele op te slaan met een melding dat er iets gebeurd is. Op iedere pagina wordt die sessie-variabele uitgelezen en, indien deze bestaat en gevuld is, getoond en vernietigd. Dat ziet er er heel erg platgeslagen zo uit:

PHP:
1
2
3
4
5
6
// form.php
// errors afhandelen
if (!isset($form_error){
    $_SESSION['success'] = 'Het record is succesvol opgeslagen! ';
    header('Location: result.php');
}


vervolgens:
PHP:
1
2
3
4
5
// result.php
if (isset($_SESSION['success']){
    echo $_SESSION['success'];
    unset($_SESSION['success'];
}


Dit heb ik inmiddels getest op 3 verschillende Apache servers en 2 IIS servers. Op Apache werkt het helemaal naar behoren, op IIS niet helemaal. Op IIS kreeg ik het succes-bericht namelijk helemaal niet te zien. Na wat testen bleek dat als ik de unset uitzet, het succes-bericht wel in beeld komt. Na weer wat verder debuggen blijkt dat er bij het sturen van de header('Location:..') een soort 'refresh' plaatsvindt. Ik heb het nu voor IIS zo op weten te lossen:


PHP:
1
2
3
4
5
6
7
// form.php
// errors afhandelen
if (!isset($form_error){
    $_SESSION['success'] = 'Het record is succesvol opgeslagen! ';
    $_SESSION['counter'] = 0;
    header('Location: result.php');
}


vervolgens:
PHP:
1
2
3
4
5
6
7
8
9
10
// result.php
if (isset($_SESSION['success']){
    echo $_SESSION['success'];
    if ($_SESSION['counter'] === 1) {
        unset($_SESSION['success'],$_SESSION['counter']);
    }
    if (isset($_SESSION['counter'])){ 
        $_SESSION['counter']++; 
    }
}


Visueel in de browser zie je verder niets van een soort 'refresh'; ook in de browsertools (F12) zie ik niets gebeuren. Het lijkt er dus op dat er serverside iets gebeurt, maar wat?

Ik heb ook vastgesteld dat wanneer ik dezelfde code doorloop (de originele code zonder $_SESSION['counter'] alles naar behoren werkt wanneer ik niet via de header naar de volgende pagina ga. Ik zet dan het succes-bericht in de sessie, en ga vervolgens handmatig naar een andere pagina. Het lijkt er dus op dat dit probleem samenhangt met het gebruik van het doorsturen via de header.

Ik heb het internet ook al aardig afgespeurd maar krijg eigenlijk niets relevants gevonden; dat heeft ongetwijfeld te maken met de juiste keywords. Wie weet wat hier gebeurt? :S

Aanvulling

Het gaat hierbij om IIS 8 i.c.m. met PHP versie 7. Van de twee IIS 8 servers die het probleem geven is een uitgerust met PHP 7.2 en de andere met PHP 7.3. Op Apache werkt deze code op PHP 7.2, 7.3 en 5.6. Ik ben er dus wel van overtuigd dat het probleem niet in PHP zit maar in IIS...

[Voor 5% gewijzigd door Harrie_ op 22-09-2020 10:33]

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K

Beste antwoord (via Harrie_ op 23-09-2020 16:46)


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 02-12 16:53

NMe

Quia Ego Sic Dico.

Zet eens een die of exit achter je location header. Het is een tijdje geleden dat ik met IIS heb gewerkt maar er staat me iets van bij dat er gekke dingen gebeuren met redirects als je de code verder niet afbreekt na het zetten van die header.

[Voor 5% gewijzigd door NMe op 22-09-2020 20:58]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Alle reacties


  • Barreljan
  • Registratie: December 2001
  • Laatst online: 10:58

Barreljan

...Zoom-Zoom...

Ik ben geen expert met PHP binnen IIS maar ik denk dat het, als het zou gaan om een bug, voor iedereen wel prettig is om te weten welke versie IIS en versie PHP je draait :)

Iets wat ook in de template staan van een nieuw topic (Relevante software en hardware die ik gebruik) by the way

[Voor 25% gewijzigd door Barreljan op 22-09-2020 10:14]

Time Attacker met de Mazda 323F 2.5 V6 J-spec | PV output


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
@Barreljan de OP heb ik inmiddels aangepast, sorry dat ik die template niet helemaal heb gevolgd; ik heb mijn best gedaan om een fatsoenlijke uitgebreide OP te maken.

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K


  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 13:42
Kan het zijn dat de PHP.ini binnen de apache omgeving gewoon anders is dan bij IIS?

Kun je niet het PHP configuratiebestand (php.ini) van de apache naar de iis zetten en kijken of dat het probleem verhelpt?

Indien ja kun je de 2 met elkaar vergelijken en kijken of daar een bepaalde instelling anders is.

[Voor 19% gewijzigd door BLACKfm op 22-09-2020 10:47]

Litebit.eu voorraad check :).


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
@BLACKfm ik heb helaas tot de IIS servers niet voldoende toegang om php.ini daadwerkelijk aan te mogen passen. Als ik de instellingen uitlees en vergelijk (m.b.v. phpinfo();) dan zijn er ontzettend veel verschillen tussen IIS en Apache...

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Harrie_ schreef op dinsdag 22 september 2020 @ 09:19:Ik heb inmiddels een aardige workaround gevonden maar ik zou toch graag willen weten waar het aan ligt...
Deze workaround is wat mij betreft alles behalve aardig. Als er dubbel werk gedaan wordt, moet dat gefixed ipv dat je dan maar de melding max 2x toont. Een PR met zo’n symptoomfix zou ik direct declinen.

Dus het is goed dat je nu achter de oorzaak zoekt. ;)
Visueel in de browser zie je verder niets van een soort 'refresh'; ook in de browsertools (F12) zie ik niets gebeuren. Het lijkt er dus op dat er serverside iets gebeurt, maar wat?

Ik heb ook vastgesteld dat wanneer ik dezelfde code doorloop (de originele code zonder $_SESSION['counter'] alles naar behoren werkt wanneer ik niet via de header naar de volgende pagina ga. Ik zet dan het succes-bericht in de sessie, en ga vervolgens handmatig naar een andere pagina. Het lijkt er dus op dat dit probleem samenhangt met het gebruik van het doorsturen via de header.
Ik ga er van uit dat het stuk dat de melding consumeert 2x uitgevoerd wordt. Weet je zeker dat je niet teveel rendert tijdens de hit die de redirect doet? Dus dat bij die omgeving de response met de Location header ook al de flash message bevat? Bekijk vooraldie hele response dus in je network tab.

{signature}


  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 10:55
Je moet even kijken naar de response die je terug krijgt op IIS. PHP op IIS werkt via FastCGI. Een aantal IIS versies hebben een bug in FastCGI met bepaalde headers, en dan met name redirects. Soms wordt de header overschreven, en in dit geval komt hij blijkbaar terug in de volgende response waardoor je een dubbele redirect krijgt.

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

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 02-12 16:53

NMe

Quia Ego Sic Dico.

Zet eens een die of exit achter je location header. Het is een tijdje geleden dat ik met IIS heb gewerkt maar er staat me iets van bij dat er gekke dingen gebeuren met redirects als je de code verder niet afbreekt na het zetten van die header.

[Voor 5% gewijzigd door NMe op 22-09-2020 20:58]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
NMe schreef op dinsdag 22 september 2020 @ 20:58: er staat me iets van bij dat er gekke dingen gebeuren met redirects als je de code verder niet afbreekt na het zetten van die header.
Niets geks aan, header() stuurt enkel een header. Dus je moet zeker expliciet neerzetten wat je daarna wil. En daarom ga ik er inderdaad van uit dat bericht al tijdens de redirectende hit getoond en geteld wordt. ;)

{signature}


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 02-12 16:53

NMe

Quia Ego Sic Dico.

Voutloos schreef op dinsdag 22 september 2020 @ 22:47:
[...]
Niets geks aan, header() stuurt enkel een header. Dus je moet zeker expliciet neerzetten wat je daarna wil. En daarom ga ik er inderdaad van uit dat bericht al tijdens de redirectende hit getoond en geteld wordt. ;)
"Gek" als in ongewenst, niet onverklaarbaar. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
@NMe kwam met de oplossing. Ik had natuurlijk geen exit staan achter de header :F
Inmiddels toegevoegd en alles werkt naar verwachting d:)b

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K

Pagina: 1


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