parsimonhi a écrit :
Reste que cette affaire a l'air de dépendre du système de l'ordinateur du client : ça marche avec des simples quotes chez moi sans problème, que ce soit avec MacOS ou Windows 10.
Quelqu'un aurait une explication ?
Je n'ai pas d'explication formelle qui explique par A + B le pourquoi du comment.
Ma surprise est plus du fait que chez vous, Parsimonhi, cela fonctionne alors que théoriquement vous devriez obtenir le même résultat que Lbolux.
En fait je doute que la distinction soit faite à ce niveau par l'OS ou le navigateur. Je doute même que le soucis se situe du côté du client.
Mais j'ai une hypothèse sur la question. En effet, la documentation PHP indique que la fonction header attend un string comme paramètre à la fonction.
Tout comme moi vous savez qu'un string enclavé par des guillemets double indique au parser que le contenu est susceptible de contenir une (ou des) variable qu'il faudra remplacer par leur valeur. Ceci à l'inverse d'une enclave par des guillemets simples qui indique qu'il faudra interpréter le contenu tel quel.
Toutefois dans le cas où une chaine de caractère est enclavée de guillemets doubles, la seule précaution prise par le parser en ce qui concerne l'interprétation de guillemet simple est de l'échapper afin qu'il soit retransmit fidèlement, c'est-à-dire en tant qu'apostrophe.
A ce stade on peut en déduire que le parser PHP interprètera toujours la chaîne "Content-Disposition:attachment;filename='Bondecommande.pdf'" comme étant à restituer telle quelle sans guillemets double mais avec les guillemets simples (en interne ils seront mêmes préfixés d'un anti-slash).
Maintenant que se passe-t-il lorsque PHP passe la main ?
L'instruction header a la particularité d'être une fonction qui s'adresse directement au serveur (Apache ou Nginx) et c'est lui qui procède au traitement de la chaine de caractère transmise par PHP.
Donc le serveur reçoit l'instruction de définir une en-tête (la fonction header) et procède au découpage du paramètre de celle-ci afin d'en déduire la/les instructions à appliquer à ses en-têtes.
D'un prime time il découpe au niveau des point-virgules qui est le marqueur indiquant la fin d'une instruction et en sort donc ici deux "jeux de données" :
- Disposition:attachment et
- filename='Bondecommande.pdf'
Ensuite il cherche à déterminer les "étiquettes" (appelons-les comme ça, je ne connais pas leur nom officiel) et leur valeur associée. Ainsi il détermine :
- la donnée attachment est attachée à l'étiquette disposition (laissons ce fait de côté)
- la donnée 'Bondecommande.pdf' est attachée à l'étiquette filename (remarquez l'omniprésence des guillemets simples).
Du coup, par cette réflexion, j'en viens à me dire que la différence d'interprétation entre votre système, Parsimonhi, et celui de Lbolux vient peut-être d'une différence de configuration du serveur. Il m'apparaît probable que par un de vos savant réglage vous vous soyez affranchi du problème du "avec ou sans apostrophe" et que dans le cas où votre serveur en détecte dans ce type de contexte il ferme simplement les yeux en faisant comme s'ils n'existaient pas.
Peut-être une piste, qu'en pensez-vous ?
Tout ça pour dire que j'ai été amené à utiliser ce genre d'instruction en production sur différents serveurs (tous Apache) et que la version sans les guillemets simples ne m'a jamais fait défaut, mais qu'à cette heure je serais bien incapable de pouvoir vous dire quel élément permettrait de s'affranchir de ce détail.
Merci de m'avoir lu et allez boire un verre, c'est mérité.