Ticket Hash: 91c265212b251fb65f18086f7faa3f91dc3f1702
Title: admin/install.php semble ignorer la config WWW_URI
Status: Closed Type: Bug
Severity: Important Priority: Immediate
Subsystem: Resolution: Misconfiguration
Last Modified: 2022-07-12 16:42:34
Version Found In: 1.1.27
User Comments:

gyscos added on 2022-07-11 17:24:47:

J'essaye d'auto-héberger garradin sans lui donner un sous-domaine dédié; à la place, un nginx redirrige (avec proxy_pass et proxy_redirect) /garradin vers un container docker.

Pour ça j'ai un fichier de config qui spécifie const WWW_URI = '/garradin/';.

Ca semble marcher pour les assets (CSS, javascript, ...), mais visiblement pas pour la cible du formulaire, qui est "/admin/install.php", sans prendre en compte cette config.


bohwaz added on 2022-07-12 12:19:17:

Hello,

effectivement la cible des formulaires utilise la directive REQUEST_URI pour déterminer l'adresse.

Si ce n'est pas le bon chemin c'est que ton serveur web est mal configuré :)


gyscos added on 2022-07-12 13:59:25:

Je ne suis pas certain que REQUEST_URI soit prévu pour ça.

Répétons donc la configuration décrite dans le ticket d'origine:

  • Un container docker (lien github), qui embarque son propre nginx, php fpm et garradin lui-même.
  • Un nginx frontend sert de reverse proxy est renvoit vers le container docker décrit plus haut. La configuration pour cette location est:
location /garradin/ {  
    proxy_set_header X-Real-IP  $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host; 
    proxy_set_header X-Original-Request $request_uri;
    proxy_set_header request_uri $request_uri;

    proxy_pass http://localhost:8008/; 
} 

Le point important étant que le serveur qui fait le reverse proxy (et la ré-écriture d'url) n'est pas celui qui lance php.

Donc quand le frontend reçoit une request pour /garradin/admin/install.php, il envoit une request pour /admin/install.php au container, et c'est cette URI que le nginx du container voit, et qu'il fournit à php.

Il serait possible pour le nginx frontend d'inclure un Header avec l'uri d'origine, mais je ne trouve pas un seul header qui pourrait faire ça - j'ai essayé X-Original-Request et request-uri comme on peut le voir dans la config plus haut, mais php semble ignorer ces headers.

Tout ceci semble indiquer que $_SERVER['REQUEST_URI'] n'est pas adapté pour trouver l'URL que le client a demandé, lorsque un (ou plusieurs) reverse proxy sont dans la chaine.


gyscos added on 2022-07-12 14:42:34:

(C'est bien pour cette raison que la config WWW_URI existe, n'est-ce pas ? Pour que garradin puisse savoir quelle est la "base" publique où il est hébergé, puisque cette information est perdue en passant à travers les proxy. En grande partie car, alors qu'il y a des header semi-standard pour préserver l'hôte d'origine, il n'en y en a pas vraiment - ou alors pas que php ne considère - pour préserver la requête entière d'origine.)