Spip derrière Varnish : port non-standard dans l'URL ?
Spip ajoute intempestivement le port aux URL qu'il génère quand celui-ci est non-standard (ie. ni 80 ni 443). Ça pose un problème quand le serveur applicatif (Apache+PHP, Nginx+PHP, etc.) se trouve derrière un reverse proxy (Varnish) sur la même machine, et écoute donc non pas sur 80 mais sur 81 ou 8080, par exemple.
Ça casse notamment l'URL de spip_admin.css
et du SPIP-CRON en toute fin de page.
Pour « corriger » sur mon installation, j'ai modifié la fonction url_de_base()
du fichier ecrire/inc/utils.php
en commentant ce bloc :
if (isset($_SERVER['SERVER_PORT']) AND $port=$_SERVER['SERVER_PORT'] AND strpos($host,":")==false){ if ($http=="http" AND $port!=80) $host.=":$port"; if ($http=="https" AND $port!=443) $host.=":$port"; }
Évidemment c'est un peu barbare... Pourquoi ne pas utiliser l'URL de base spécifiée dans l'interface d'admin (Configuration > Identité du site : Adresse (URL) du site public) ? Le commentaire de la fonction url_de_base()
précise que c'est parce que meta(adresse_site)
peut être fausse ; mais alors à quoi bon la demander et à quoi sert-elle ?
Bref, il devrait être possible de servir Spip sur un port non-standard sans pour autant casser les URLs.
Pour info :
- L'architecture initiale (traditionnelle) : Client -> Nginx (port 80) -> PHP (Spip)
- Nouvelle archi avec reverse proxy : Client -> Varnish (port 80) -> Nginx (port 81) -> PHP (Spip)
Versions :
- SPIP 3.0.17 [21515]
- Nginx 1.2.1
- Varnish 3.0.2
- Debian 7.8 Wheezy