Il modo migliore / pratiche per garantire i collegamenti stanno per posizione corretta quando non sulla radice del dominio?
-
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
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.