Il modo migliore / pratiche per garantire i collegamenti stanno per posizione corretta quando non sulla radice del dominio?

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

  •  05-09-2019
  •  | 
  •  

Domanda

Me lo chiedo questo per un po 'di tempo, ma qual è il modo migliore per garantire che in una web app (RoR, Sinatra, PHP, qualsiasi cosa) che quando si sta creando collegamenti (sia la generazione di un metodo, o la scrittura a mano) che vanno al posto giusto se siete sulla radice di un dominio o no: http: / /www.example.com/ o http: / /www.example.com/this/is/where/the/app/is/

I miei pensieri sono ottenere l'utente finale di specificare un radice del documento da qualche parte nella configurazione della vostra applicazione, e l'uso che, però sto cercando di pensare ad un bel modo per farlo senza l'utente finale dover configurare nulla.

Modifica:. Con l'utente finale, voglio dire che istituisce l'applicazione su un server di persona

Modifica: posso usare il principio '/' per ottenere sempre il link relativo al dominio, ma il problema è che cosa succede se l'applicazione stessa non è alla radice, ma un posto come http://www.example.com/this/is/where/the/app/is/ in modo che voglio dire gen_link('/') e farlo tornare /this/is/where/the/app/is/ o gen_link('/some/thing') e /this/is/where/the/app/is/some/thing ritorno

È stato utile?

Soluzione

Che ne dite di provare a impostare l'elemento base nella testa di voi layout HTML?
In primo luogo, ottenere l'URL, ad esempio. in un modo Ilya suggerisce (se PHP è OK per voi). Dopo di che è possibile utilizzare il tag base come segue:

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

Che impostare l'URL di default per tutti i link e il browser sarà anteporre a ogni collegamento relativo alla pagina.

Altri suggerimenti

Prima di tutto è necessario instradare tutti gli URL attraverso una sorta di funzione di url ri-scrittore.

Quindi, si fa più:

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

Ma invece qualcosa come:

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

Tutti i framework web là fuori hanno una funzione come questa. Mentre di solito fanno tutti i tipi di magia in là (a che fare con i percorsi MVC controller e punti di vista e ciò che non), al termine della funzione (concettualmente) hanno tutti antepongono il vostro URL con una "radice" (ad esempio "/this/is/where/the/app/is/"), in modo da per consentire di creare URL nell'applicazione che sono indipendenti di un percorso di base hard-coded.

RoR utilizza una direttiva di configurazione chiamato "relative_url_root" .

Symfony (php) utilizza una direttiva di configurazione chiamata anche "relative_url_root" .

CakePHP utilizza una direttiva di configurazione chiamato "WEBROOT_DIR" .

Nel caso in cui queste strutture sono in esecuzione su Apache, questo valore è spesso calcolata in modo dinamico (se non è stata impostata in modo esplicito). Su altri server web le variabili di ambiente sono spesso non disponibili o non sono corrette in modo da questo valore non può essere determinato in modo coerente.

La risposta di Ilya è una buona, ma credo che un modo più semplice per farlo è solo per precedere tutti i link con un leader "/". Questo farà sì che siano sempre relativo alla radice del dominio:

<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 -->

È possibile determinare tutto ciò che serve da soli, senza bisogno di configurazioni.

Ecco un esempio di PHP (diciamo index.php è il tuo nome dello 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;
?>

Ora, si può sempre fare un link come questo:

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

Si veda anche la discussione nei commenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top