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

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • 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 ]

Hoeder van het Noord-Meierijse dialect

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


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

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


Acties:
  • 0 Henk 'm!

  • Barreljan
  • Registratie: December 2001
  • Laatst online: 17-09 12:02

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


Acties:
  • +1 Henk 'm!

  • 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.

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 17-09 15:56

BLACKfm

o_O

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 :).


Acties:
  • 0 Henk 'm!

  • 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...

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • 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}


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Nu online
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
  • +2 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

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.


Acties:
  • 0 Henk 'm!

  • 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}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

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

Hoeder van het Noord-Meierijse dialect

Pagina: 1