Réécrire les règles et l’URL de base

Quand on utilise une règle de réécriture, dites:

RewriteRule ^foo/(.+?)/?$ index.php?type=foo&value=$1 [NC,L] 

Le client considère toujours cela comme un serveur d’ server.dom/foo/bar/ (il ne sait pas comment ces URL sont résolues en interne, ce qui est bien sûr raisonnable).

Si la page index.php génère cependant un lien ( link ), le client interprétera ceci comme server.dom/foo/bar/https://stackoverflow.com/questions/26331538/rewrite-rules-and-base-url/baz . index.php n’a cependant dans bien des cas aucune connaissance complète de l’origine de l’url …

Une première idée était de passer la profondeur du chemin “virtuel” en tant que paramètre. Ainsi, la règle de réécriture serait quelque chose comme:

 RewriteRule ^foo/(.+?)/?$ index.php?type=foo&depth=2&value=$1 [NC,L] 

En conséquence, index.php devrait écrire:

  

Ou plus formellement depth temps de depth .. (séparés par des barres obliques). Dans certains cas, cependant, .htaccess n’a aucune connaissance de la profondeur du chemin “virtuel”. De plus, on peut noter que la dernière barre oblique ( / ) dans la règle de réécriture est facultative, selon que la barre oblique a été écrite ou non, la profondeur varie. Cela augmenterait le nombre de RewriteRules manière significative …

Quelles sont les bonnes / meilleures pratiques pour résoudre ce problème de liens relatifs de manière robuste (robuste peut-être dans le sens où les parties mobiles du site Web ne “briseront” pas les liens)?

Si vous utilisez de jolis liens, je suggère fortement de ne pas utiliser de liens relatifs. Vous pouvez utiliser des liens comme:

 link 

où la fonction base() est définie dans certains config.php à output /foo/ .

De cette façon, le lien se résoudra à /foo/baz au lieu de /foo/bar/baz . Si vous devez déplacer votre site Web vers un autre chemin, mettez simplement à jour votre fonction base() dans votre config.php . C’est la même chose que de nombreux frameworks CMS comme WordPress ou CakePHP.