[spip-dev] Proposition de correction de url_absolue()

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.

Actuellement la fonction contient ça :

if (!$base)
    $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');

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.

Qu'en pensez vous ?

Pas d'avis défavorable.
Seulement ta correction ne fonctionne pas là :slight_smile:

if (!$base) {
  $base = ($b = url_de_base())
    ? $b . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '')
    : $GLOBALS['meta']['adresse_site'];
}

C'est plus un truc comme ça.
Parce que c'est url_de_base() qui retourne vide, pas _DIR_RESTREINT_ABS systématiquement.

MM

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.

C’est url_de_base() qu’il faudrait corriger :slight_smile:

C'est url_de_base() qu'il faudrait corriger :slight_smile:

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.

C'est url_de_base() qu'il faudrait corriger :slight_smile:

Ok donc autre proposition, pour corriger dans url_de_base().

Après la définition de $host, si ce dernier est vide, le remplacer par "adresse_site". Ce qui donnerait :

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

Ce qui donnerait ça :

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.

Bonne soirée
G