Spip derrière Varnish : port non-standard dans l'URL ?
#3386
Closed
opened 8 years ago by miros
·
37 comments
No Branch/Tag Specified
1.8
1.9.1
1.9.2
2.0
2.1
3.0
3.1
3.2
4.0
4.1
4.2
boutons-danger
coquille_doc
debug_ecrire_fichier
dev-sortable
dev/autoloader
dev/hasard_fixe
dev/instituer_ergo
dev/issue_4626_menu_squelettes
dev/issue_5447_exporter_csv
dev_infos_image
fix/valider_url_distante
fix_issue_5454
fix_modifier_login
issue_4101
issue_4678
issue_4705
issue_4717
issue_4836
issue_4946
issue_5258
issue_5344
issue_5427_bis
issue_5483_find_script_jquery
issue_5487_info_maj
master
v1.8.3+b
v1.9.1+i
v1.9.2+f
v1.9.2+g
v1.9.2+h
v1.9.2+i
v1.9.2+j
v1.9.2+k
v1.9.2+m
v1.9.2+n
v1.9.2+o
v1.9.2+p
v2.0.0
v2.0.1
v2.0.10
v2.0.11
v2.0.12
v2.0.13
v2.0.14
v2.0.15
v2.0.16
v2.0.17
v2.0.18
v2.0.19
v2.0.2
v2.0.20
v2.0.21
v2.0.22
v2.0.23
v2.0.24
v2.0.25
v2.0.26
v2.0.3
v2.0.5
v2.0.6
v2.0.7
v2.0.8
v2.0.9
v2.1.0
v2.1.1
v2.1.10
v2.1.11
v2.1.12
v2.1.13
v2.1.14
v2.1.15
v2.1.16
v2.1.17
v2.1.18
v2.1.19
v2.1.2
v2.1.20
v2.1.21
v2.1.22
v2.1.23
v2.1.24
v2.1.25
v2.1.26
v2.1.27
v2.1.28
v2.1.29
v2.1.3
v2.1.30
v2.1.4
v2.1.5
v2.1.6
v2.1.7
v2.1.8
v2.1.9
v3.0.0
v3.0.0-alpha.1
v3.0.0-beta
v3.0.0-beta.2
v3.0.0-rc
v3.0.1
v3.0.10
v3.0.11
v3.0.12
v3.0.13
v3.0.14
v3.0.15
v3.0.16
v3.0.17
v3.0.18
v3.0.19
v3.0.2
v3.0.20
v3.0.21
v3.0.22
v3.0.23
v3.0.24
v3.0.25
v3.0.26
v3.0.27
v3.0.28
v3.0.3
v3.0.4
v3.0.5
v3.0.6
v3.0.7
v3.0.8
v3.0.9
v3.1.0
v3.1.0-alpha
v3.1.0-beta
v3.1.0-rc
v3.1.0-rc.2
v3.1.0-rc.3
v3.1.1
v3.1.10
v3.1.11
v3.1.12
v3.1.13
v3.1.14
v3.1.15
v3.1.2
v3.1.3
v3.1.4
v3.1.5
v3.1.6
v3.1.7
v3.1.8
v3.1.9
v3.2-alpha.1
v3.2.0
v3.2.0-alpha.1
v3.2.0-beta
v3.2.0-beta.2
v3.2.0-beta.3
v3.2.1
v3.2.10
v3.2.11
v3.2.12
v3.2.13
v3.2.14
v3.2.15
v3.2.16
v3.2.17
v3.2.2
v3.2.3
v3.2.4
v3.2.5
v3.2.6
v3.2.7
v3.2.8
v3.2.9
v4.0.0
v4.0.0-alpha
v4.0.0-beta
v4.0.1
v4.0.2
v4.0.3
v4.0.4
v4.0.5
v4.0.6
v4.0.7
v4.0.8
v4.0.9
v4.1.0
v4.1.0-alpha
v4.1.0-beta
v4.1.0-rc
v4.1.1
v4.1.2
v4.1.3
v4.1.4
v4.1.5
v4.1.6
v4.1.7
v4.2.0-alpha
v4.2.0-alpha2
Labels
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
Apply labels
Clear labels
accessibilité
amélioration
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
No Label
accessibilité
amélioration
APIs
authentification
base de données
bug
code généré
compilo
css
divers
documentation
doublon
ergonomie
espace privé
filtres et balises
formulaires
Inscription
installation
invalide
javascript
langues
LDAP
plugin
PostgreSQL
refusé
sécurité
traduction
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
10 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
This issue currently doesn't have any dependencies.
Reference in new issue
There is no content yet.
Delete Branch '%!s(MISSING)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
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 fichierecrire/inc/utils.php
en commentant ce bloc :É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 quemeta(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 :
Versions :
Pour ma part j'utilise SPIP et Varnish sans aucun souci, avec une config que j'ai documentée ici http://zzz.rezo.net/Interfacer-Varnish-SPIP.html ; et cela sur 3 serveurs.
Je n'ai remarqué aucun souci avec le port "non standard" sur lequel tourne mon serveur apache.
Pour répondre à ta question, url_de_base() donne la base de l'URL sur laquelle on est appelé ; un même site SPIP peut très bien répondre sur plusieurs noms de domaines, sans se mélanger les pinceaux.
Fil Up a écrit :
Et un phpinfo() via Varnish sur tes serveurs montre bien $_SERVER["SERVER_PORT"] = 81 (ou 8080 dans ton cas) ? Si oui, saurais-tu m'expliquer pourquoi url_de_base() ne te renvoie pas http://hostname:8080/spip/, notamment pour spip_admin.css, quand tu es logué ? Ton _SERVER["HTTP_HOST"] contient peut-être déjà ":80" ?
M'enfin, je ne fait que remonter mon expérience ; si ça n'affecte que moi, tant mieux. ;-)
Ah en effet, je n'ai pas le problème que tu signales car mon phpinfo() me dit (à tort !) qu'il est appelé par le port 80.
Est-ce que ça peut être un effet du mod_rpaf que j'ai installé dans apache ?
Exemple sur www.spip.net :
(78.202.xx.xx est l'adresse ip de mon navigateur)
Bien vu. La doc de
mod_rpaf
précise en effet qu'il réécrit « REMOTE_ADDR, HTTPS, and HTTP_PORT to the values provided by an upstream proxy ».Ça n'a pas l'air d'être le cas du module Realip de Nginx (que j'utilise), ni de mod_remoteip, qui remplace mod_rpaf depuis Apache 2.4.
http://wiki.nginx.org/HttpRealipModule
https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
On pourrait forcer, dans la conf Varnish, un entête
X-Forwarded-Port
qui serait parsé directement par Spip. Quelque chose comme ça :Soit :
Soit :
ecrire/inc/utils.php
:Mathieu MD a écrit :
trop compliqué à mon avis ; il me semblerait plus simple d'avoir un define pour indiquer à SPIP qu'il peut sauter cette partie du code ; ou bien, pour la liste des ports à ignorer :
define('_PORTS_STANDARDS', '80,443')
Fil Up a écrit :
Hum... Comparativement à toute la conf Varnish à faire pour SPIP, pas si compliqué que ça, quand même. ;-)
En tout cas ça serait plutôt un entête X-Forwarded-Host: www.example.com:80 qu'il faudrait utiliser, puisque
X-Forwarded-Port
ne semble pas très standard ni commun : ni Squid ni Apache ne le mentionnent.https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_fields
Ça me semble plus propre de n'avoir rien à configurer à la main dans SPIP. Ainsi, on ajoute et supprime les proxies/load balancers à la volée sans impact sur le logiciel.
D'ailleurs, le sysadmin des serveurs n'a pas nécessairement un compte d'administrateur SPIP.
Certes, mais ça sort du cadre de ce ticket, non ?
Puisqu'on parle d'un bug de SPIP (qui réécrit l'URL dans un cas où il ne faudrait pas), il faut d'abord trouver une solution interne à SPIP.
SPIP doit pouvoir marcher avec un varnish de base, sans conf spécifique. Parfois l'hébergeur te met un varnish en front et ne te permet pas de le configurer. C'est pour ça que je ne suis pas pour le fait d'exiger un réglage spécifique côté Varnish.
À noter: il est certainement possible de bidouiller la valeur problématique depuis le fichier mes_options.php
quote : "Parfois l'hébergeur te met un varnish en front et ne te permet pas de le configurer. C'est pour ça que je ne suis pas pour le fait d'exiger un réglage spécifique côté Varnish." Tout à fait. C'est le cas notamment de Gandi Simple Hosting pour lequel l'hébergé ne peut aucunement paramétrer varnish.
Je propose le patch suivant :
$_SERVER['X-Forwarded-Host']
on le prend en priorité$_SERVER['X-Forwarded-Host']
dans les signatures de cache pour ne pas se faire empoisonner le cache par des requêtes malicieusesComme ça on couvre les 2 approches, qui peut le plus peut le moins. Ça vous convient ?
Version cible mise à 3.1
il faut vraiment être sûrs qu'on ne prend pas de risque d'injection de PHP ou de js ?
Bien vu, je propose donc
$host = strtr($_SERVER['X-Forwarded-Host'], "<>?\"' \r\n", '________');
pour sanitizer $_SERVER['X-Forwarded-Host']
Appliqué par commit r22351.
Statut changé à Fermé
Commit avec le bon nom de variable HTTP_X_FORWARDED_HOST !
Il me semble que c’est un peu dangereux de faire confiance à l’en-tête
X-Forwarded-Host
. Via cette en-tête, on peut maitriser l’URL de base de la page HTML qui sera générée et donc de définir un emplacement arbitraire depuis lequel seront téléchargés les fichiers CSS et JavaScript.Olivier;
Salut tout le monde.
Je rencontre actuellement le même "problème" sur 3.1 Revision: 22380. SPIP n'arrive pas à déterminer "seul" le bon port.
Un trick (qui fait le job) est de rajouter $_SERVER['SERVER_PORT']='443'; dans mes_options.php.
En en parlant avec l'hébergeur, il suggère un truc pas con, c'est de se baser sur HTTP_X_FORWARDED_PROTO qui, lui, renvoi vraiment le protocole.
Dans mon cas, j'ai le résultat suivant (de simples echo hors SPIP donc directement sur le serveur) :
Se baser sur HTTP_X_FORWARDED_PROTO serait donc une solution non ?
Hello,
Je rebondis sur ce ticket, où on a le même soucis sur une autre instrastructure avec un Apache qui sert de reverse proxy. Comme le signale xdjuj, pourquoi ne pas se baser sur HTTP_X_FORWARDED_PROTO ? Car c'est effectivement la bonne valeur avec cette globale.
Pour info, j'ai aussi eu un problème de port ajouté dans les urls du site, voici la discussion pour mémoire :
Peut être avec le patch
pour prendre en compte HTTP_X_FORWARDED_PROTO quand il semble licite sans risquer d'injection là ou il ne l'est pas ?
Statut changé à En cours
On en est où avec ce bug, on peut fermer le ticket ? Je m'y perds entre les différentes fermtures/ouvertures ^^
Ne faut-il pas utiliser la fonction getallheaders() pour récupérer ces entêtes, même en cas d'un Reverse Proxy Apache ?
Le patch de Cerdic https://core.spip.net/issues/3386#note-18 n'a pas été intégré en fait.
J'ai bien l'impression qu'il serait pourtant très utile (on vient de tomber aussi sur un cas qui semble en avoir besoin).
Sur cet hébergement, Nginx reçoit le site en https sur le port 443, il redirige sur Apache par le port 80, il définit
Mais pas :
Si ça peut aider.
Donc pour que ça fonctionne tel quel, on a du intégrer le patch de cerdic dans
url_de_base()
Ainsi qu'ajouter dans mes_options le port 80 comme étant normal pour du https (sinon il ajoutait :80 aux urls) :
Nous avons encore eu un signalement sur IRC de ce problème (romrom), que le patch + le define corrige.
Je viens donc d'intégrer le patch (reformaté) en 3.2 avec r23403
Reporte-t-on en 3.1 ?
J'ai pris la liberté de reporter en 3.1 avec r23404
Je pense qu'on peut clore.
En fait mon patch était bien intégré par r23093 :)
Quand HTTP_X_FORWARDED_HOST et HTTP_X_FORWARDED_PORT sont manquante il suffit de les peupler avec le host et 443 pour que tout marche. Soit on dit que c'est le mes_options qui fera ça, soit on insere ce teste avant https://core.spip.net/projects/spip/repository/revisions/23093/entry/spip/ecrire/inc_version.php#L212 mais il faut absolument eviter d'en disperser partout, et surtout de define _PORT_HTTPS_STANDARD est horrible !
Suite à discussion, la correction proposée par cerdic est différente.
Il semblerait qu'on ait aucunement besoin du define _PORT_HTTPS_STANDARD pour définir le port.
Au pire il faut peupler les variables
$_SERVER['HTTP_X_FORWARDED_nnn']
dans le fichier config/mes_options.php avec les propriétés adaptés au site.(je n'ai pas vérifié).
On va dire que tout est bon. On ferme.
Statut changé à Fermé
Statut changé à En cours
EN 3.1.8 avec les formulaires de formidable il y a la possibilité de stocker l'IP du visiteur, avec la config du serveur de Nfrance sur un site, l'IP stocké était systématiquement celle du serveur.
J'ai résolu ce souci en mettant la condition REMOTE_ADDR devant
https://core.spip.net/projects/spip/repository/revisions/23406/entry/spip/ecrire/inc_version.php#L253
voir aussi $_SERVER["REMOTE_ADDR"] gives server IP rather than visitor IP
`touti je pense qu'il serait plus clair de créer un ticket spécifique pour ce bug plutôt que d'ouvrir celui-ci qui était fermé depuis un an (même si le contexte est le même, le bug lui ne l'est pas).
Statut changé à Fermé
`b_b j'ai fermé le ticket, effectivement ce n'est pas le même contexte !
Bonjour,
Je me permet de ré-ouvrir ce ticket car j'ai encore le problème sur des sites en 3.2.1 à jour avec svn.
Quand j'active le cache chez mon hébergeur, cela rajotue des ports 80 dans les chemin d'image et du coup le site perds la css et les images dans le BO de SPIP
Je cite mon hébergeur :
Un réglage via mes_options serait jouable ?
Merci
A partir du moment où les
$_SERVER['HTTP_X_FORWARDED_PROTO']==='https'
et où
$_SERVER['HTTP_X_FORWARDED_HOST']
et
$_SERVER['HTTP_X_FORWARDED_PORT']
sont renseignées tout marche très bien
Regarde ta config et complète si besoin les valeurs manquantes, mais on ne peut pas prévoir tous les cas possibles, c'est donc à toi de gérer ça dans ton mes_options en renseignant ces variables si besoin
Ok mais je vois pas comment modifier mon mes_options.
Je vire varnish et on verra plus tard.