La meilleure façon / pratique d'établir des liens vont bon endroit lorsqu'ils ne sont pas sur la racine du domaine?

StackOverflow https://stackoverflow.com/questions/561443

  •  05-09-2019
  •  | 
  •  

Question

Je me demandais pendant un certain temps maintenant, mais quelle est la meilleure façon de faire en sorte que dans une application Web (RoR, Sinatra, PHP, tout) que lorsque vous créez des liens (soit la génération d'une méthode ou écrit à la main) qu'ils vont au bon endroit si vous êtes à la racine d'un domaine ou non: http: / /www.example.com/ ou http: / /www.example.com/this/is/where/the/app/is/

Mes pensées sont obtenir cependant l'utilisateur final de spécifier une racine de documents quelque part dans la configuration de votre application, et l'utiliser, je suis en train de penser à une bonne façon de le faire sans l'utilisateur final ayant pour configurer quoi que ce soit.

Edit:. Par l'utilisateur final, je veux dire la personne mise en place de l'application sur un serveur

Edit: je peux utiliser le début « / » pour toujours obtenir le lien par rapport au domaine, mais le problème est que si l'application elle-même est pas à la racine, mais un endroit comme http://www.example.com/this/is/where/the/app/is/ donc je veux dire gen_link('/') et avoir le retour /this/is/where/the/app/is/ ou gen_link('/some/thing') et retour /this/is/where/the/app/is/some/thing

Était-ce utile?

La solution

Que diriez-vous d'essayer de définir l'élément base dans la tête vous de la mise en page html?
Tout d'abord, obtenir l'URL, par exemple. d'une manière Ilya suggère (si PHP est OK pour vous). Après cela, vous pouvez utiliser la balise base comme suit:

<base href="<?= $full_site_url ?>" />

qui définirait l'URL par défaut pour tous les liens et le navigateur se préfixer à chaque lien relatif sur la page.

Autres conseils

Tout d'abord, vous devez acheminer tous vos urls par une sorte de fonction url re-écrivain.

Vous ne faites:

<a href="some/path/">Foo</a>

Mais au lieu quelque chose comme:

<a href="<%= url_for('some/path') %>">Foo</a>

Tous les frameworks web là-bas ont une fonction comme celui-ci. Alors qu'ils font habituellement toutes sortes de magie là-dedans (à voir avec les chemins de contrôleur MVC et des vues et ce non), à la fin de la fonction (conceptuellement) tous PREPEND votre URL avec une « racine » (par exemple "/this/is/where/the/app/is/"), de façon pour vous permettre de créer des urls dans votre application qui sont indépendants d'un chemin de base codée en dur.

RoR utilise une directive de configuration appelée "relative_url_root" .

Symfony (php) utilise une directive de configuration également appelée "relative_url_root" .

CakePHP utilise une directive de configuration appelée "WEBROOT_DIR" .

Dans le cas où ces cadres sont en cours d'exécution sur Apache, est souvent calculé cette valeur dynamique (si vous avez pas défini explicitement). Sur d'autres serveurs Web les variables d'environnement ne sont souvent pas disponibles ou si cette valeur incorrecte ne peut pas être déterminé de façon cohérente.

La réponse de ilya est bonne, mais je pense que d'une façon plus simple de le faire est simplement de faire précéder tous vos liens avec l'un des principaux « / ». Cela permettra d'assurer qu'ils sont toujours par rapport à la racine du domaine:

<a href="/some/thing">Something</a> <!-- Always links to www.domain.com/some/thing -->
<a href="some/thing">Something</a> <!-- Acutal destination depends current path -->

Vous pouvez déterminer tout ce que vous vous avez besoin, pas besoin de configs.

Voici un exemple de PHP (disons index.php est le nom de votre script):

<?
  $folder_on_server = substr ($_SERVER['PHP_SELF'], 0, strpos ($_SERVER['PHP_SELF'], '/index.php'));
  $server_name = $_SERVER['SERVER_NAME'];
  if (80 != $_SERVER['SERVER_PORT']) {
    $server_name .= ':'. $_SERVER['SERVER_PORT'];
  }
  $full_site_url = 'http://'. $server_name . $folder_on_server;
?>

Maintenant, vous pouvez toujours faire un lien comme ceci:

<a href="<?= $full_site_url ?>/some/thing/">Something</a>

Voir aussi la discussion dans les commentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top