Actuellement url_absolue() est buguée : quand on appelle cette fonction depuis un contexte hors navigateur classique (par exemple en ligne de commande), cette fonction ne renvoie que des URL relatifs !
En fait cette fonction va chercher en priorité le domaine/base de site *réel* utilisé à un instant T par le visiteur en cours. Ce qui est très bien car un même site peut avoir plusieurs domaines par exemple.
MAIS, sauf que cette méthode ne comporte aucun fallback : si on ne trouve pas de "domaine de navigation" en cours (parce qu'on est pas en HTTP dans un nav), alors la fonction ne va même pas chercher l'URL "officiel" déclarée dans meta/adresse_site.
Je propose donc de rajouter un fallback supplémentaire juste après : si $base est encore vide, on le remplit avec meta/adresse_site :
if (!$base)
$base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');
if (!$base)
$base = $GLOBALS['meta']['adresse_site'];
Cette correction ne va rien casser sur tous les sites existants, puisqu'elle ne concerne que les appels hors navigateurs (donc surtout spip-cli mais ça peut être d'autres cas), qui 1) sont rares, et 2) seront très contents d'avoir enfin url_absolue() renvoyant des choses absolues.
Ah ok merci, en fait j'ai juste écrit du "pseudo-code" juste pour faire comprendre le principe. Donc ok pour la vraie correction. Le tout est que ça ne casse rien pour la navigation habituelle de n'importe quel site, y compris donc en 3.0.
Ben je sais pas, ça pourrait être un choix mais ce n'est pas le même sens. Est-ce qu'on considère que url_de_base() doit toujours renvoyer une base ou bien cette fonction-là ne correspondrait qu'à l'URL de navigation ?
Parce qu'actuellement pour url_de_base() la description c'est :
Calcule l'URL de base du site, sans se fier à la méta (adresse_site) qui peut être fausse (sites avec plusieurs noms d’hôtes, déplacements, erreurs)
Mais ça pourrait être changé en disant : "sans se fier à adresse_site par défaut mais en l'utilisant en fallback en dernier recours".
Donc c'est soit ça, soit c'est url_absolue() qui doit faire le choix du fallback lorsque la base est vide.
Hmm, pourquoi ne pas prendre toute la meta adresse_site et ne pas se limiter au host ? Car sinon on risque de generer une url foireuse dans le cas ou l'adresse du site contient un sous repertoire.
Hmm, pourquoi ne pas prendre toute la meta adresse_site et ne pas se
limiter au host ? Car sinon on risque de generer une url foireuse dans
le cas ou l'adresse du site contient un sous repertoire.
Oui, et aussi le port s'il y en a un etc.
Donc en fait (et c'est ce que j'avais fait avant d'utiliser parse_url en fait…) il faudrait plutôt :
- virer/récupérer le protocole au début de adresse_site pour le mettre dans $http
- mettre tout le reste dans $host quoi que ce soit
Pour $host, si le résultat est "_", il faut prendre la valeur
définie dans la meta adresse_site.
C'est le cas dans les config Nginx par défaut.
Cela se corrige simplement au niveau Nginx en ajoutant
proxy_set_header Host $host;
pour chaque groupe, mais c'est dommage d'obliger l'admin à le faire
quand c'est bien défini dans le logiciel web (Spip etc.).
Et c'est parfois difficile à débuguer.