2009-02-18 3 views
1

Je me demandais depuis un moment maintenant, mais quel est le meilleur moyen de s'assurer que dans une application web (RoR, Sinatra, PHP, n'importe quoi) que lorsque vous créez des liens (générant avec une méthode, ou en écrivant à la main) qu'ils vont à l'endroit approprié si vous êtes sur la racine d'un domaine ou non: ou http://www.example.com/this/is/where/the/app/is/Meilleure façon de faire en sorte que les liens soient correctement positionnés lorsqu'ils ne sont pas à la racine du domaine?

Mes pensées obtiennent l'utilisateur final pour spécifier une racine de document quelque part dans la config de votre application et j'utilise ça, mais j'essaie de trouver une bonne façon de le faire sans que l'utilisateur final doive configurer quoi que ce soit. Edit: Par utilisateur final, je veux dire la personne qui configure l'application sur un serveur.

Editer: Je peux utiliser le début '/' pour toujours obtenir le lien relatif au domaine, mais le problème est que si l'application elle-même n'est pas à la racine, mais un endroit comme http://www.example.com/this/is/where/the/app/is/ alors je veux dire gen_link('/') et le faire retourner /this/is/where/the/app/is/ ou gen_link('/some/thing') et retourner /this/is/where/the/app/is/some/thing

+0

qui « utilisateur final » vous parlez exactement? –

Répondre

3

Que diriez-vous d'essayer de définir l'élément base dans la tête de mise en page html vous?
D'abord, obtenez 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éfinira l'URL par défaut pour tous les liens et le navigateur préfixer à chaque lien relatif sur la page.

+0

Je l'ai déjà utilisé mais je l'ai oublié. Ça fera l'affaire. –

0

Vous pouvez déterminer tout ce dont vous avez besoin vous-même, 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 celui-ci:

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

Voir aussi la discussion dans les commentaires .

+0

Pour cela, si votre application est sur http://www.example.com/foo/bar/ et que vous gérez une demande pour http://www.example.com/foo/bar/baz/biz/ $ folder_on_server finira par être '/ foo/bar/baz/biz'? Je veux qu'il se termine par '/ foo/bar' qui est la racine de l'application. –

+0

Ma pratique consiste à gérer toutes les demandes par le biais du répertoire racine d'index.php dans l'application. Ainsi, $ folder_on_server sera toujours/foo/bar quelle que soit la requête que vous manipulez. J'appelle (incluez) ce que j'aime d'index.php, mais c'est mon point d'entrée à tout :-) –

+0

SERVER_NAME est incohérent. http://shiflett.org/blog/2006/mar/server-name-versus-http-host. C'est totalement inutile si votre serveur d'applications est derrière un équilibreur de charge ou un proxy (comme HTTP_HOST d'ailleurs). Vous auriez besoin de HTTP_X_FORWARDED_HOST si disponible. –

0

La réponse de ilya est bonne, mais je pense un moyen 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 --> 
1

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

Vous ne le sont plus:

<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 généralement toutes sortes de magie là-bas (à faire avec les chemins et les vues de contrôleur MVC et quoi que ce soit), à la fin de la fonction (conceptuellement) ils préfèrent tous votre url avec une racine (par exemple "/this/is/where/the/app/is/"), de sorte que pour vous permettre de créer des URL dans votre application qui sont indépendantes d'un chemin de base codé en dur.

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

Symfony (PHP) utilise une directive de configuration appelée aussi "relative_url_root".

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

Dans les 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 sont souvent indisponibles ou incorrectes. Par conséquent, cette valeur ne peut pas être déterminée de manière cohérente.

Questions connexes