Quali sono i consigli per il tag html <base>?


462

Non ho mai visto <base>tag HTML effettivamente utilizzati da nessuna parte prima. Ci sono insidie ​​nel suo uso che significa che dovrei evitarlo?

Il fatto di non averlo mai notato in uso in un moderno sito di produzione (o in qualsiasi altro sito) mi rende diffidente, anche se sembra che potrebbe avere utili applicazioni per semplificare i collegamenti sul mio sito.


modificare

Dopo aver usato il tag base per alcune settimane, ho finito per trovare alcuni importanti trucchi utilizzando il tag base che lo rendono molto meno desiderabile di quanto non appaia inizialmente. In sostanza, le modifiche href='#topic'e href=''sotto il tag di base sono molto incompatibili con il loro comportamento di default, e questo cambiamento dal comportamento predefinito potrebbe facilmente rendere le librerie di terze parti al di fuori del vostro controllo molto inaffidabile in modi inaspettati, poiché dipenderanno logicamente dal comportamento predefinito. Spesso le modifiche sono impercettibili e portano a problemi non immediatamente ovvi quando si ha a che fare con una base di codice di grandi dimensioni. Da allora ho creato una risposta che illustra in dettaglio i problemi che ho riscontrato di seguito. Quindi prova i risultati dei link per te stesso prima di impegnarti in una diffusione diffusa di <base>, è il mio nuovo consiglio!


12
Viene spesso utilizzato nelle versioni memorizzate nella cache dei risultati dei motori di ricerca per mantenere attivi i collegamenti.
Gumbo,

11
Solo da notare: il tag base interagisce anche con semplici ancore, quindi se si utilizza base, anche quello che in precedenza era solo un ancoraggio a una posizione nella pagina <a href='#anchor1'>Anchor1</a>utilizzerà il tag base, ignorando il comportamento predefinito di riferimento alla pagina corrente come la base. Quindi è sicuramente qualcosa a cui fare attenzione (anche se potrebbe essere risolto usando un altro tag di base nelle pagine che usano molte ancore).
Kzqai,

1
Se non sei soddisfatto della risposta accettata, perché non la accetti e la riassegni?
apre il

1
Non sapevo che fosse un'opzione, ma sì, non voglio replicare puttana (se mi dà anche punti), ma penso che in ultima analisi gli svantaggi superino i vantaggi e voglio evidenziarlo.
Kzqai,

2
In genere non guardi il codice sorgente di tutti i principali siti a cui vai. Credo che più persone stiano usando di <base>quanto si pensi.
Mathias Lykkegaard Lorenzen,

Risposte:


259

Prima di decidere se utilizzare il <base>tag o meno, è necessario capire come funziona, a cosa può essere utilizzato e quali sono le implicazioni e infine superare i vantaggi / gli svantaggi.


Il <base>tag semplifica principalmente la creazione di collegamenti relativi nelle lingue dei modelli in quanto non è necessario preoccuparsi del contesto corrente in ogni collegamento.

Puoi fare per esempio

<base href="${host}/${context}/${language}/">
...
<link rel="stylesheet" href="css/style.css" />
<script src="js/script.js"></script>
...
<a href="home">home</a>
<a href="faq">faq</a>
<a href="contact">contact</a>
...
<img src="img/logo.png" />

invece di

<link rel="stylesheet" href="/${context}/${language}/css/style.css" />
<script src="/${context}/${language}/js/script.js"></script>
...
<a href="/${context}/${language}/home">home</a>
<a href="/${context}/${language}/faq">faq</a>
<a href="/${context}/${language}/contact">contact</a>
...
<img src="/${context}/${language}/img/logo.png" />

Si noti che il <base href>valore termina con una barra, altrimenti verrà interpretato rispetto all'ultimo percorso.


Per quanto riguarda la compatibilità del browser, ciò causa solo problemi in Internet Explorer. Il <base>tag è in HTML specificato come non avere un tag di chiusura </base>, quindi è legittimo per solo uso <base>senza un tag di chiusura. Tuttavia IE6 pensa diversamente e l'intero contenuto dopo il <base>tag è in tal caso posto come figlio del <base>elemento nell'albero del DOM HTML. Ciò può causare a prima vista problemi inspiegabili in Javascript / jQuery / CSS, vale a dire che gli elementi sono completamente irraggiungibili in selettori specifici come html>body, fino a quando non si scopre nell'ispettore DOM HTML che ci dovrebbe essere un base(e head) in mezzo.

Una correzione IE6 comune utilizza un commento condizionale IE per includere il tag di fine:

<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->

Se non ti interessa il W3 Validator o quando sei già su HTML5, puoi semplicemente chiuderlo da solo, ogni browser web lo supporta comunque:

<base href="http://example.com/en/" />

La chiusura del <base>tag risolve anche istantaneamente la follia di IE6 su WinXP SP3 per richiedere <script>risorse con un URI relativo srcin un ciclo infinito.

Un altro potenziale problema di IE si manifesterà quando si utilizza un URI relativo nel <base>tag, come <base href="https://stackoverflow.com//example.com/somefolder/">o <base href="https://stackoverflow.com/somefolder/">. Questo fallirà in IE6 / 7/8. Questo non è tuttavia esattamente colpa del browser; l'utilizzo di URI relativi nel <base>tag è proprio a torto. La specifica HTML4 ha affermato che dovrebbe essere un URI assoluto, iniziando quindi con lo schema http://o https://. Questo è stato eliminato nelle specifiche HTML5 . Quindi, se usi HTML5 e scegli solo i browser compatibili con HTML5, allora dovresti andare tutto bene usando un URI relativo nel <base>tag.


Per quanto riguarda l'utilizzo di ancoraggi con nome / hash come <a href="#anchor">, ancore di stringhe di query <a href="?foo=bar">e ancoraggi con frammenti di percorso <a href=";foo=bar">, con il <base>tag stai praticamente dichiarando tutti i collegamenti relativi ad esso, incluso quel tipo di ancore. Nessuno dei collegamenti relativi è più relativo all'URI della richiesta corrente (come accadrebbe senza il <base>tag). Questo può in primo luogo essere fonte di confusione per i principianti. Per costruire quelle ancore nel modo giusto, devi fondamentalmente includere l'URI,

<a href="${uri}#anchor">hash fragment</a>
<a href="${uri}?foo=bar">query string</a>
<a href="${uri};foo=bar">path fragment</a>

dove ${uri}fondamentalmente si traduce in $_SERVER['REQUEST_URI']in PHP, ${pageContext.request.requestURI}in JSP e #{request.requestURI}in JSF. Si noti che i framework MVC come JSF hanno tag che riducono tutta questa piastra di caldaia e ne eliminano la necessità <base>. Vedi anche a quale URL utilizzare per collegare / navigare ad altre pagine JSF .


BalusC, più o meno nello stesso periodo in cui ho scritto la risposta qui stackoverflow.com/a/46539210/632951 c'erano oltre 10+ commenti utili sotto questa discussione pubblicati da più autori in 8 anni che dettagliavano informazioni riguardanti <base>. Qualche idea su quale link i commenti sono stati spostati?
Pacerier,

162

Ripartizione degli effetti del tag base:

Il tag di base sembra avere alcuni effetti non intuitivi e raccomando di essere consapevole dei risultati e di testarli da soli prima di fare affidamento <base>! Da quando li ho scoperti dopo aver provato a utilizzare il tag di base per gestire siti locali con URL diversi e ho scoperto gli effetti problematici solo dopo, con mio sgomento, mi sento in dovere di creare questo sommario di queste potenziali insidie ​​per gli altri.

Userò un tag base di: <base href="http://www.example.com/other-subdirectory/">come il mio esempio nei casi seguenti, e farò finta che la pagina su cui si trova il codice sia http://localsite.com/original-subdirectory

Maggiore:

Nessun collegamento o ancoraggio con nome o href vuoto rimanderà alla sottodirectory originale, a meno che ciò non sia esplicito: il tag di base rende ogni collegamento in modo diverso, includendo invece i collegamenti di ancoraggio della stessa pagina all'URL del tag di base, ad esempio:

  • <a href='#top-of-page' title='Some title'>A link to the top of the page via a named anchor</a>
    diventa
    <a href='http://www.example.com/other-subdirectory/#top-of-page' title='Some title'>A link to an #named-anchor on the completely different base page</a>

  • <a href='?update=1' title='Some title'>A link to this page</a>
    diventa
    <a href='http://www.example.com/other-subdirectory/?update=1' title='Some title'>A link to the base tag's page instead</a>

Con un po 'di lavoro, puoi risolvere questi problemi sui link su cui hai il controllo, specificando esplicitamente che questi link si collegano alla pagina in cui si trovano, ma quando aggiungi librerie di terze parti al mix che si basano sul comportamento standard, può facilmente causare un grande casino.

Minore:

Correzione di IE6 che richiede commenti condizionali: richiede commenti condizionali per ie6 per evitare di rovinare la gerarchia dom, ovvero <base href="http://www.example.com/"><!--[if lte IE 6]></base><![endif]-->come BalusCmenzioni nella sua risposta sopra.

Quindi, nel complesso, il problema principale rende l'uso complicato a meno che tu non abbia il pieno controllo di modifica su ogni collegamento, e come temevo originariamente, questo lo rende più problemi di quanto valga la pena. Ora devo andare e riscrivere tutti i miei usi! : p

Collegamenti correlati di test per problemi durante l'utilizzo di "frammenti" / hash:

http://www.w3.org/People/mimasa/test/base/

http://www.w3.org/People/mimasa/test/base/results


Modifica di Izzy: Per tutti voi che avete la stessa confusione nei miei confronti riguardo ai commenti:

L'ho appena testato da solo, con i seguenti risultati:

  • barra finale o no, non fa differenza per gli esempi forniti qui ( #anchore ?queryverrebbe semplicemente aggiunto a quello specificato <BASE>).
  • Tuttavia, fa la differenza per i collegamenti relativi: omettendo la barra finale, other.htmle dir/other.htmlinizierebbe DOCUMENT_ROOTcon l'esempio dato, /other-subdirectoryessendo (correttamente) trattato come file e quindi omesso.

Quindi, per i collegamenti relativi, BASEfunziona bene con la pagina spostata - mentre gli ancoraggi e ?queriesavrebbero bisogno di specificare esplicitamente il nome del file (con BASEuna barra finale o l'ultimo elemento non corrispondente al nome del file in cui viene utilizzato).

Pensa a come <BASE>sostituire l' URL completo al file stesso (e non alla directory in cui risiede) e otterrai le cose giuste. Supponendo che il file utilizzato in questo esempio fosse other-subdirectory/test.html(dopo che è stato spostato nella nuova posizione), la specifica corretta avrebbe dovuto essere:

<base href="http://www.example.com/other-subdirectory/test.html">

- et voilà, tutto funziona come previsto: #anchor, ?query, other.html, very/other.html, /completely/other.html.


27

Bene, aspetta un minuto. Non credo che il tag di base meriti questa cattiva reputazione.

La cosa bella del tag base è che ti consente di eseguire riscritture di URL complessi con meno problemi.

Ecco un esempio Decidi di spostare http://example.com/product/category/thisproduct su http://example.com/product/thisproduct . Si modifica il file .htaccess per riscrivere il primo URL nel secondo URL.

Con il tag di base in atto, fai la tua riscrittura .htaccess e il gioco è fatto. Nessun problema. Ma senza il tag di base, tutti i collegamenti relativi si interromperanno.

Le riscritture degli URL sono spesso necessarie, perché modificarle può aiutare l'architettura del tuo sito e la visibilità dei motori di ricerca. È vero, avrai bisogno di soluzioni alternative per i problemi "#" e "menzionati dalla gente. Ma il tag di base merita un posto nel toolkit.


10
Dal mio punto di vista, il problema è a prova di futuro. Se si utilizza il tag di base in una pagina, tutte le altre librerie che interagiscono con la pagina saranno interessate dal tag di base, comprese le librerie di terze parti che potrebbero fare affidamento sul comportamento predefinito del tag di ancoraggio nudo o degli hash.
Kzqai,

4
@Kzqai, +1 Punto positivo, ma ci sono molti siti Web che non usano librerie difettose. Il problema non è con base href, è con la libreria e deve essere risolto lì.
Pacerier,

2
@Pacerier, direi che il problema è in effetti con base href. O meglio, il problema è che i browser non sembrano abbastanza intelligenti da non avere effetti su anchor href che iniziano con #. Ho tentato di risolvere questo problema con javascript e ciò ha causato problemi con le librerie che utilizzano i href='#'collegamenti (bootstrap, ad esempio). Incolpare le biblioteche è come incolparle di tutto ciò che non va nell'HTML. È uno strumento obsoleto per un lavoro moderno, semplice come.
Deji,

2
"esegui riscritture di URL complessi con meno problemi." - Anche se, in questo caso, il basetag è probabilmente una soluzione alternativa per non aver (correttamente) usato URL relativi alla radice (o addirittura URL assoluti) in primo luogo.
MrWhite,

@Deji, quando ho scritto "problema", intendo "bug". Sì, l'esistenza stessa di base href è davvero un vero "problema", ma nel caso sopra, sto dicendo che il bug non è con base href. (Eppure, per una volta, non pensare che io supporti l'utilizzo di base href, infatti, la mia posizione è che base href nella sua versione attuale sia inutile : stackoverflow.com/a/46539210/632951 . Il modo migliore per procedere ora è deprecarlo o abilitare più hrefs di base in quanto è utile solo quando è possibile utilizzare multipli)
Pacerier

22

Per decidere se deve essere utilizzato o meno, è necessario essere consapevoli di ciò che fa e se è necessario. Questo è già parzialmente delineato in questa risposta , alla quale ho anche contribuito. Ma per facilitare la comprensione e il seguito, una seconda spiegazione qui. Per prima cosa dobbiamo capire:

Come vengono elaborati i collegamenti dal browser senza <BASE>essere utilizzati?

Per alcuni esempi, supponiamo di avere questi URL:

A) http://www.example.com/index.html
B) http://www.example.com/
C) http://www.example.com/page.html
D)http://www.example.com/subdir/page.html

A + B generano entrambi lo stesso file ( index.html) che viene inviato al browser, C ovviamente invia page.htmle D invia /subdir/page.html.

Supponiamo inoltre che entrambe le pagine contengano una serie di collegamenti:

1) collegamenti assoluti pienamente qualificati ( http://www...)
2) collegamenti assoluti locali ( /some/dir/page.html)
3) collegamenti relativi inclusi nomi di file ( dir/page.html) e
4) collegamenti relativi solo con "segmenti" ( #anchor, ?foo=bar).

Il browser riceve la pagina e esegue il rendering dell'HTML. Se trova qualche URL, deve sapere dove puntarlo. Questo è sempre chiaro per Link 1), che è preso così com'è. Tutti gli altri dipendono dall'URL della pagina renderizzata:

URL     | Link | Result
--------+------+--------------------------
A,B,C,D |    2 | http://www.example.com/some/dir/page.html
A,B,C   |    3 | http://www.example.com/dir/page.html
D       |    3 | http://www.example.com/subdir/dir/page.html
A       |    4 | http://www.example.com/index.html#anchor
B       |    4 | http://www.example.com/#anchor
C       |    4 | http://www.example.com/page.html#anchor
D       |    4 | http://www.example.com/subdir/page.html#anchor

Ora cosa cambia con l' <BASE> essere usato?

<BASE>dovrebbe sostituire l'URL come appare al browser . Quindi esegue il rendering di tutti i collegamenti come se l'utente avesse richiamato l'URL specificato in <BASE>. Il che spiega un po 'di confusione in molte altre risposte:

  • ancora una volta, nulla cambia per "collegamenti assoluti pienamente qualificati" ("tipo 1")
  • per i collegamenti assoluti locali, il server di destinazione potrebbe cambiare (se quello specificato <BASE>differisce da quello chiamato inizialmente dall'utente)
  • gli URL relativi diventano critici qui, quindi devi fare particolare attenzione a come imposti <BASE>:
    • meglio evitare di impostarlo su a directory . In questo modo, i collegamenti di "tipo 3" potrebbero continuare a funzionare, ma sicuramente interrompono quelli di "tipo 4" (ad eccezione di "caso B")
    • impostarlo sul nome file completo produce, nella maggior parte dei casi, i risultati desiderati.

Un esempio lo spiega meglio

Supponi di voler "preimpostare" alcuni URL utilizzando mod_rewrite :

  • file reale: <DOCUMENT_ROOT>/some/dir/file.php?lang=en
  • URL reale: http://www.example.com/some/dir/file.php?lang=en
  • URL intuitivo: http://www.example.com/en/file

Supponiamo che mod_rewritevenga utilizzato per riscrivere in modo trasparente l'URL intuitivo in quello reale (nessun reindirizzamento esterno, quindi quello "user friendly" rimane nella barra degli indirizzi del browser, mentre quello reale viene caricato). Cosa fare adesso?

  • non <BASE>specificato: interrompe tutti i collegamenti relativi (come si baserebbero http://www.example.com/en/fileora)
  • <BASE HREF='http://www.example.com/some/dir>: Assolutamente sbagliato. dirsarebbe considerato parte del file dell'URL specificato, quindi tutti i collegamenti relativi sono interrotti.
  • <BASE HREF='http://www.example.com/some/dir/>: Meglio già. Ma i collegamenti relativi di "tipo 4" sono ancora interrotti (tranne per "caso B").
  • <BASE HREF='http://www.example.com/some/dir/file.php>: Esattamente. Tutto dovrebbe funzionare con questo.

Un'ultima nota

Tieni presente che questo vale per tutti gli URL nel tuo documento:

  • <A HREF=
  • <IMG SRC=
  • <SCRIPT SRC=
  • ...

riferendosi alla tua ultima nota ... Sono curioso ... cambia anche il modo in cui una richiesta Ajax di jQuery verrà interpretata. Questo è diverso da<SCRIPT SRC=
bkwdesign

@bkwdesign Non uso jQuery, ma lo suppongo.
Izzy,

@Izzy, Re "esempio" In realtà , se si predispone </some/dir/file.php?lang=en> su </ en / file>, si vorrà anche preimpostare </ some / dir / page2? Lang = en> e </ some / dir / script> su </ en / page2> e </ en / script>. Quindi i tuoi percorsi relativi funzioneranno esattamente come dovrebbero .
Pacerier,

come <BASE HREF='http://www.example.com/some/dir/file.php>funzionerebbe con "tipo 4"? non sarebbe come " example.com/some/dir/file.php?foo=bar " invece di example.com/subdir/page.html?foo=bar
ANewGuyInTown

@ANewGuyInTown Sì, ed è quello che dovrebbe - come nel mio esempio http://www.example.com/some/dir/file.phpè la "posizione reale" (vedi "un esempio lo spiega meglio"), e passando solo un frammento ( #anchor) può essere risolto solo lì.
Izzy,

12

Inizialmente Drupal si è affidato al <base>tag e in seguito ha deciso di non utilizzarlo a causa di problemi con i crawler e le cache HTTP.

In genere non mi piace pubblicare link. Ma vale davvero la pena condividere questo perché potrebbe essere utile a chi cerca i dettagli di un'esperienza reale con il <base>tag:

http://drupal.org/node/13148


Il collegamento indica una discussione avuta otto anni prima di questa risposta, quindi ora quasi un decennio fa. Penso che dovrebbe esserci un po 'più di test da fare se questo è ancora un problema, piuttosto che collegarsi a una descrizione così antica di un problema che potrebbe non esistere.
Sami Kuhmonen,

È vero, ma IMHO è ancora una rivelazione per quanto riguarda i problemi di cui hai bisogno per testare l' <base>implementazione basata, non solo che le tue ancore funzionano direttamente nel tuo browser.
Amr Mostafa,

@AmrMostafa, Basta non usare base href.
Pacerier,

10

Semplifica le pagine per la visualizzazione offline; puoi inserire l'URL completo nel tag di base e quindi le tue risorse remote verranno caricate correttamente.


@Erik, a parte la visualizzazione offline, funziona anche per tutte le casi d'uso di stopgap che devono demo una pagina di un dominio su un altro dominio. Ad esempio, quando si esegue il demo di una pagina su jsfiddle, è possibile utilizzare base href per basare il proprio dominio anziché il dominio di jsfiddle. ¶ Sebbene realisticamente parlando, la creazione di un tag solo per tali casi di stopgap non è un buon progetto, quindi href di base dovrebbe essere deprecato e rimosso anche se può essere utile per tali casi di utilizzo di stopgap.
Pacerier,

5

L'hash "#" attualmente funziona per i collegamenti jump in combinazione con l'elemento base, ma solo nelle ultime versioni di Google Chrome e Firefox, NON IE9.

IE9 sembra far ricaricare la pagina, senza saltare da nessuna parte. Se si utilizzano i collegamenti di salto all'esterno di un iframe, mentre si dirige il frame per caricare i collegamenti di salto su una pagina separata all'interno del frame, si otterrà invece una seconda copia della pagina dei collegamenti di jump caricata all'interno del frame.


5

Probabilmente non è molto popolare perché non è ben noto. Non avrei paura di usarlo poiché tutti i principali browser lo supportano.

Se il tuo sito utilizza AJAX, ti consigliamo di assicurarti che tutte le tue pagine siano impostate correttamente o che potresti finire con collegamenti che non possono essere risolti.

Basta non usare l' targetattributo in una pagina HTML 4.01 Strict.


In realtà, basetarget può essere utile, ma bashref non lo è. In effetti, non è popolare perché non è utile . Vedi il mio ans.
Pacerier,

Ora tutti i browser supportano i basetag.
Vitaly Zdanevich,

3

Nel caso delle immagini SVG incorporate nella pagina c'è un altro problema importante che si presenta quando basesi usa il tag:

Dato che con il basetag (come già notato sopra) perdi effettivamente la possibilità di utilizzare URL hash relativi come in

<a href="#foo">

perché verranno risolti rispetto all'URL di base anziché alla posizione del documento corrente e quindi non sono più relativi. Quindi dovrai aggiungere il percorso del documento corrente a questi tipi di collegamenti come in

<a href="https://stackoverflow.com/path/to/this/page/name.html#foo">

Quindi uno degli aspetti apparentemente positivi del base tag (che è quello di spostare i prefissi URL lunghi lontano dal tag anchor e ottenere ancoraggi più belli e più corti) si ritorce completamente contro gli URL hash locali.

Ciò è particolarmente fastidioso quando si inserisce SVG nella tua pagina, sia esso SVG statico o SVG generato dinamicamente perché in SVG possono esserci molti di questi riferimenti e si interromperanno non appena baseviene utilizzato un tag, nella maggior parte, ma non tutti gli utenti implementazioni degli agenti (Chrome almeno funziona ancora in questi scenari al momento della stesura).

Se stai usando un sistema di template o un'altra catena di strumenti che elabora / genera le tue pagine, proverei sempre a sbarazzarmi del basetag, perché come lo vedo, porta più problemi sul tavolo di quanti ne risolva.


Con o senza SVG, il tag di base è inutile e considerato dannoso . Vedere la mia elaborazione: stackoverflow.com/a/46539210/632951
Pacerier

3

Inoltre, dovresti ricordare che se esegui il tuo server Web su una porta non standard devi includere anche il numero di porta su href di base:

<base href="//localhost:1234" />  // from base url
<base href="../" />  // for one step above

2

Non ho mai visto davvero il punto di usarlo. Fornisce pochissimo vantaggio e potrebbe persino rendere le cose più difficili da usare.

A meno che tu non abbia centinaia o migliaia di collegamenti, tutti nella stessa sottodirectory. Quindi potrebbe risparmiare alcuni byte di larghezza di banda.

Come ripensamento, mi sembra di ricordare che si è verificato un problema con il tag in IE6. Potresti posizionarli in qualsiasi parte del corpo, reindirizzando diverse parti del sito verso posizioni diverse. Questo problema è stato risolto in IE7, che ha distrutto molti siti.


3
Il vantaggio probabilmente non è quello di risparmiare larghezza di banda, ma URL più puliti e più brevi. Sfortunatamente, i sottili cambiamenti nel comportamento di tutti i collegamenti non ne valgono davvero la pena, a quanto pare.
Kzqai,

1
Il basetag è una soluzione ad alcuni problemi. Se non hai problemi, non utilizzare il basetag. Esempi: 1. Riutilizzo del contenuto HTML in diversi sistemi. I collegamenti vengono mantenuti relativi nel contenuto e baseviene impostato un tag appropriato (dal CMS) in modo che i collegamenti si risolvano correttamente. 2. Un sito esistente utilizza URL relativi in ​​tutto, ma in seguito decide di implementare URL "graziosi" che modificano la profondità del percorso URL. Un basetag può essere visto come preferibile per "correggere" tutti gli URL relativi.
MrWhite,

@MrWhite, CMS non ha bisogno di utilizzare il tag di base per risolvere correttamente i collegamenti poiché HTML supporta già percorsi relativi predefiniti nella cartella corrente. Vedere elaborazione qui: stackoverflow.com/a/46539210/632951
Pacerier

1
@Pacerier Dipende da dove si trova il contenuto (FWIW non mi riferisco a WordPress et al).
MrWhite,

@MrWhite in genere un CMS non utilizzerà i collegamenti statici in primo luogo, quindi questo esempio è piuttosto strano. In effetti, pochissimi siti Web in questi giorni sono costruiti utilizzando HTML statico. - Posso vedere i tuoi punti lì, ma quelle sono soluzioni a problemi che ora sono sostanzialmente obsoleti. (Tutti e i loro nonni usano WordPress, o simili, per tutto.)
Atli,


2

Lavorando con AngularJS il tag BASE ha rotto $ cookieStore in silenzio e mi ci è voluto un po 'di tempo per capire perché la mia app non poteva più scrivere cookie. Essere avvisati ...


1

Una cosa da tenere a mente:

Se sviluppi una pagina Web da visualizzare in UIWebView su iOS, devi utilizzare il tag BASE. Semplicemente non funzionerà diversamente. Sia JavaScript, CSS, immagini - nessuna di esse funzionerà con collegamenti relativi in ​​UIWebView, a meno che non sia specificato il tag BASE.

Sono stato preso da questo prima, fino a quando non l'ho scoperto.


1

Ho trovato un modo di usare <base>e collegamenti basati sull'ancoraggio. Puoi usare JavaScript per mantenere i link come #contactfunzionano come devono. L'ho usato in alcune pagine di parallasse e funziona per me.

<base href="http://www.mywebsite.com/templates/"><!--[if lte IE 6]></base><![endif]-->

...content...

<script>
var link='',pathname = window.location.href;
$('a').each(function(){
    link = $(this).attr('href');
    if(link[0]=="#"){
        $(this).attr('href', pathname + link);
    }
});
</script>

Si dovrebbe usare alla fine della pagina


0

La mia raccomandazione NON<base> è di utilizzare l' elemento nella gestione dei percorsi degli URL . Perché?

Si scambia solo un problema con un altro. Senza l'elemento base puoi usare qualsiasi sistema di percorsi che ti piace per i tuoi percorsi e collegamenti relativi senza timore che si rompano. Nel momento in cui imposti l'elemento base su un percorso in cui sei "bloccato" per progettare tutti i tuoi URL affinché lavorino su quel percorso e ora dovrai cambiare TUTTI i percorsi per lavorare dal percorso base. Cattiva idea!

Ciò significa che ora devi scrivere percorsi più lunghi e tenere traccia di dove ogni percorso è relativo a questa base. Peggio ancora .... quando usi l' <base>elemento ti raccomandano di usare un percorso di base completo per supportare i browser più vecchi (" https://www.example.com/ "), quindi ora hai codificato il tuo dominio nel tuo pagina o reso tutti i tuoi collegamenti dipendenti da un percorso di dominio valido.

D'altra parte, nel momento in cui rimuovi nuovamente il percorso di base dal tuo sito Web, ora sei di nuovo libero di utilizzare percorsi relativi più brevi, che possono essere pienamente qualificati, utilizzare percorsi assoluti dalla radice o utilizzare percorsi che sono realmente relativi al file e cartella in cui ti trovi. È molto più flessibile. E soprattutto i frammenti come "#hello" funzionano correttamente senza ulteriori correzioni. Ancora una volta, le persone stanno creando problemi che non esistono.

Inoltre, l'argomento sopra che l'URL di base dell'utente ti aiuta a migrare le cartelle delle pagine Web in nuove posizioni delle sottocartelle non ha molta importanza oggi poiché la maggior parte dei server moderni ti consente di impostare rapidamente qualsiasi sottocartella come nuova cartella radice dell'applicazione in qualsiasi dominio. La definizione o la "radice" di un'applicazione Web non è vincolata da cartelle o domini ora.

Sembra un po 'sciocco l'intero dibattito. Quindi dico di lasciare l'url di base e supportare il vecchio sistema di percorso predefinito server-client nativo che non lo utilizza.

Nota: se il problema che hai è controllare i percorsi a causa di un nuovo sistema API, la soluzione è semplice ... sii coerente nel modo in cui installi tutti i tuoi URL e link nella tua API. Non fare affidamento sul supporto browser di base o HTML5 o trucchi circensi più recenti come fanno i kiddie API javascript. Basta tracciare costantemente tutti i tag di ancoraggio e non si avranno mai problemi. Inoltre, l'applicazione Web è immediatamente trasportabile su nuovi server indipendentemente dai sistemi di percorso utilizzati.

Ciò che è vecchio è nuovo di nuovo! L'elemento di base riguarda chiaramente il tentativo di creare una soluzione a un problema che non è mai esistito nel mondo Web 20 anni fa, tanto meno oggi.


-1

Esempio di href di base

Pronuncia una tipica pagina con link:

<a href=home>home</a> <a href=faq>faq</a> <a href=etc>etc</a>

.e collegamenti a una cartella diff:

..<a href=../p2/home>Portal2home</a> <a href=../p2/faq>p2faq</a> <a href=../p2/etc>p2etc</a>..

Con href di base , possiamo evitare di ripetere la cartella di base:

<base href=../p2/>
<a href=home>Portal2-Home</a> <a href=faq>P2FAQ</a> <a href=contact>P2Contact</a>

Quindi è una vittoria ... eppure le pagine troppo spesso contengono URL per basi diff. E il web corrente supporta solo un href di base per pagina , quindi la vincita viene persa rapidamente come basi che non sono base ∙ ripetute href, ad esempio:

<a href=../p1/home>home</a> <a href=../p1/faq>faq</a> <a href=../p1/etc>etc</a>
<!--.. <../p1/> basepath is repeated -->

<base href=../p2>
<a href=home>Portal2-Home</a> <a href=faq>P2FAQ</a> <a href=contact>P2Contact</a>


Conclusione

( Il target di base potrebbe essere utile.) Base href è inutile in quanto:

  • pagina è ugualmente bagnata poiché:
    • base predefinita [cartella dei genitori] ⇌ perfetto (salvo eccezioni non necessarie / rare 𝒞1 e 𝒞2 ).
    • web corrente h href a base multipla non supportati .

Relazionato


È certo che @downvoters non sarà in grado di spiegare in che modo Basehref è utile, specialmente quando intere industrie sconsigliano ampiamente di usarlo.
Pacerier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.