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:
vervolgens:
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:
vervolgens:
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?
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...
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?
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