Eu nunca vi uma <base>
tag HTML realmente usada em qualquer lugar antes. Existem armadilhas em seu uso, o que significa que devo evitá-lo?
O fato de eu nunca ter percebido isso em uso em um site de produção moderno (ou em qualquer site) me deixa desconfiado, embora pareça que ele possa ter aplicativos úteis para simplificar os links no meu site.
Editar
Depois de usar a tag base por algumas semanas, acabei encontrando algumas dicas importantes sobre o uso da tag base, que a tornam muito menos desejável do que parecia à primeira vista. Essencialmente, as alterações na marca de base href='#topic'
e href=''
abaixo dela são muito incompatíveis com o comportamento padrão, e essa alteração no comportamento padrão pode facilmente tornar as bibliotecas de terceiros fora do seu controle muito pouco confiáveis. de maneiras inesperadas, pois dependerão logicamente do comportamento padrão. Geralmente, as alterações são sutis e levam a problemas não imediatamente óbvios ao lidar com uma grande base de código. Desde então, criei uma resposta detalhando os problemas que experimentei abaixo. Portanto, teste os resultados do link antes de se comprometer com uma implantação ampla de <base>
, é o meu novo conselho!
fonte
<a href='#anchor1'>Anchor1</a>
também usará a tag base, substituindo o comportamento padrão de se referir à página atual como a base. Definitivamente, é algo a observar (embora possa ser corrigido usando outra tag base em páginas que usam muitas âncoras).<base>
que você imagina.Respostas:
Antes de decidir se deve
<base>
ou não usar a tag, é necessário entender como ela funciona, para que pode ser usada e quais são as implicações e, finalmente, superam as vantagens / desvantagens.A
<base>
tag facilita principalmente a criação de links relativos em idiomas de modelo, pois você não precisa se preocupar com o contexto atual em cada link.Você pode fazer por exemplo
ao invés de
Observe que o
<base href>
valor termina com uma barra, caso contrário, será interpretado em relação ao último caminho.Quanto à compatibilidade do navegador, isso causa apenas problemas no IE. A
<base>
tag está em HTML especificado como não tendo uma tag final</base>
, portanto, é legítimo usar apenas<base>
sem uma tag final. No entanto, o IE6 pensa de outra maneira e, nesse caso, todo o conteúdo após a<base>
tag é colocado como filho do<base>
elemento na árvore HTML DOM. Isso pode causar problemas inexplicáveis à primeira vista em Javascript / jQuery / CSS, ou seja, os elementos sendo completamente inacessíveis em seletores específicos comohtml>body
, até você descobrir no inspetor HTML DOM que deve haver umbase
(ehead
) no meio.Uma correção comum do IE6 está usando um comentário condicional do IE para incluir a tag final:
Se você não se importa com o W3 Validator, ou quando já está em HTML5, pode fechar automaticamente, todos os navegadores da Web o suportam de qualquer maneira:
Fechar a
<base>
tag também corrige instantaneamente a insanidade do IE6 no WinXP SP3 para solicitar<script>
recursos com um URI relativosrc
em um loop infinito.Outro possível problema do IE se manifestará quando você usar um URI relativo na
<base>
tag, como<base href="https://example.com/somefolder/">
ou<base href="https://stackoverflow.com/somefolder/">
. Isso falhará no IE6 / 7/8. No entanto, isso não é exatamente culpa do navegador; o uso de URIs relativos na<base>
tag está errado. A especificação HTML4 afirmou que deveria ser um URI absoluto, começando assim com o esquemahttp://
ouhttps://
. Isso foi descartado na especificação HTML5 . Portanto, se você usa HTML5 e direciona apenas navegadores compatíveis com HTML5, deve ficar bem usando um URI relativo na<base>
tag.Quanto ao uso de âncoras de fragmentos nomeados / hash
<a href="#anchor">
, como âncoras de seqüência de caracteres de consulta<a href="?foo=bar">
e âncoras de fragmentos de caminho<a href=";foo=bar">
, com a<base>
tag que você basicamente declara todos os links relativos, incluindo esse tipo de âncora. Nenhum dos links relativos é mais relativo ao URI da solicitação atual (como aconteceria sem a<base>
tag). Isso pode, em primeiro lugar, ser confuso para iniciantes. Para construir essas âncoras da maneira certa, você basicamente precisa incluir o URI,onde
${uri}
basicamente se traduz$_SERVER['REQUEST_URI']
em PHP,${pageContext.request.requestURI}
JSP e#{request.requestURI}
JSF. Deve-se notar que as estruturas MVC como o JSF possuem tags, reduzindo todo esse padrão e removendo a necessidade<base>
. Consulte também ao Qual URL usar para vincular / navegar para outras páginas JSF .fonte
Repartição dos efeitos da tag base:
A tag base parece ter alguns efeitos não intuitivos, e eu recomendo estar ciente dos resultados e testá-los antes de confiar
<base>
! Desde que os descobri depois de tentar usar a tag base para lidar com sites locais com URLs diferentes e só descobri os efeitos problemáticos depois, para meu desgosto, sinto-me compelido a criar este resumo dessas possíveis armadilhas para outras pessoas.Usarei uma tag base de:
<base href="http://www.example.com/other-subdirectory/">
como meu exemplo nos casos abaixo, e fingirei que a página em que o código está é http://localsite.com/original-subdirectoryPrincipal:
Nenhum link ou âncora nomeada ou hrefs em branco apontarão para o subdiretório original, a menos que isso seja explicitado: A tag base torna tudo vinculado de maneira diferente, incluindo links de âncora da mesma página para o URL da tag base, por exemplo:
<a href='#top-of-page' title='Some title'>A link to the top of the page via a named anchor</a>
torna-se
<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>
torna-se
<a href='http://www.example.com/other-subdirectory/?update=1' title='Some title'>A link to the base tag's page instead</a>
Com algum trabalho, você pode corrigir esses problemas nos links que você controla, especificando explicitamente que esses links apontam para a página em que estão, mas quando você adiciona bibliotecas de terceiros à mistura que depende do comportamento padrão, pode facilmente causar uma grande bagunça.
Menor:
Correção do IE6 que requer comentários condicionais: requer comentários condicionais para o ie6 para evitar estragar a hierarquia do dom, ou seja,
<base href="http://www.example.com/"><!--[if lte IE 6]></base><![endif]-->
comoBalusC
mencionado na resposta acima.Portanto, em geral, o principal problema é complicado, a menos que você tenha controle total da edição de todos os links e, como eu inicialmente temia, isso cria mais problemas do que vale a pena. Agora eu tenho que sair e reescrever todos os meus usos! : p
Links relacionados para testar problemas ao usar "fragmentos" / hashes:
http://www.w3.org/People/mimasa/test/base/
http://www.w3.org/People/mimasa/test/base/results
Editar por Izzy: Para todos vocês que se deparam com a mesma confusão que eu em relação aos comentários:
Acabei de testar eu mesmo, com os seguintes resultados:
#anchor
e?query
seria simplesmente anexado ao especificado<BASE>
).other.html
edir/other.html
começariaDOCUMENT_ROOT
com o exemplo fornecido,/other-subdirectory
sendo (corretamente) tratado como arquivo e, portanto, omitido.Portanto, para links relativos,
BASE
funciona bem com a página movida - enquanto âncoras e?queries
precisaria que o nome do arquivo fosse especificado explicitamente (comBASE
uma barra final ou o último elemento que não corresponde ao nome do arquivo em que é usado).Pense nisso como
<BASE>
substituindo a URL completa no próprio arquivo (e não no diretório em que reside), e você acertará as coisas. Supondo que o arquivo usado neste exemplo foiother-subdirectory/test.html
(depois de movido para o novo local), a especificação correta deveria ter sido:- et voila, tudo funciona como esperado:
#anchor
,?query
,other.html
,very/other.html
,/completely/other.html
.fonte
Bem, espere um minuto. Não acho que a tag base mereça essa má reputação.
O bom da tag base é que ela permite que você reescreva URLs complexas com menos problemas.
Aqui está um exemplo. Você decide mover http://example.com/product/category/thisproduct para http://example.com/product/thisproduct . Você altera o arquivo .htaccess para reescrever o primeiro URL para o segundo URL.
Com a tag base no lugar, você reescreve .htaccess e é isso. Sem problemas. Mas sem a tag base, todos os seus links relativos serão quebrados.
As reescritas de URL geralmente são necessárias, porque ajustá-las pode ajudar a arquitetura do site e a visibilidade do mecanismo de pesquisa. É verdade que você precisará de soluções alternativas para os problemas "#" e '' mencionados pelo pessoal. Mas a tag base merece um lugar no kit de ferramentas.
fonte
href='#'
links (bootstrap, por exemplo). Culpar as bibliotecas é como culpá-las por tudo o que dá errado com o HTML. É uma ferramenta desatualizada para um trabalho moderno, simples como.base
tag seja uma solução alternativa por não ter (corretamente) usado URLs relativos à raiz (ou mesmo absolutos) em primeiro lugar.Para decidir se deve ou não ser usado, você deve estar ciente do que faz e se é necessário. Isso já está parcialmente descrito nesta resposta , para a qual também contribuí. Mas, para facilitar a compreensão e o acompanhamento, uma segunda explicação aqui. Primeiro precisamos entender:
Como os links são processados pelo navegador sem
<BASE>
serem usados?Para alguns exemplos, vamos supor que temos estes URLs:
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 resultam no mesmo arquivo (
index.html
) enviado ao navegador, C enviapage.html
e D envia/subdir/page.html
.Vamos supor, as duas páginas contêm um conjunto de links:
1) links absolutos totalmente qualificados (
http://www...
)2) links absolutos locais (
/some/dir/page.html
)3) links relativos, incluindo nomes de arquivos (
dir/page.html
), e4) links relativos apenas com "segmentos" (
#anchor
,?foo=bar
).O navegador recebe a página e renderiza o HTML. Se encontrar algum URL, ele precisará saber para onde apontar. Isso está sempre claro no Link 1), que é tomado como está. Todos os outros dependem do URL da página renderizada:
Agora, o que muda com o
<BASE>
uso?<BASE>
deve substituir o URL como ele aparece no navegador . Por isso, torna todas as ligações como se o usuário tivesse chamado o URL especificado no<BASE>
. O que explica algumas das confusões em várias das outras respostas:<BASE>
diferente do que está sendo chamado inicialmente pelo usuário)<BASE>
:Um exemplo explica melhor
Digamos que você queira "embelezar" um URL usando
mod_rewrite
:<DOCUMENT_ROOT>/some/dir/file.php?lang=en
http://www.example.com/some/dir/file.php?lang=en
http://www.example.com/en/file
Vamos supor que
mod_rewrite
é usado para reescrever de forma transparente o URL amigável ao real (não redirecionar externo, portanto o "amigável" permanece na barra de endereços do navegador, enquanto o real é carregado). O que fazer agora?<BASE>
especificado: quebra todos os links relativos (como eles seriam baseadoshttp://www.example.com/en/file
agora)<BASE HREF='http://www.example.com/some/dir>
: Absolutamente errado.dir
seria considerada a parte do arquivo da URL especificada; portanto, todos os links relativos estão quebrados.<BASE HREF='http://www.example.com/some/dir/>
: Melhor já. Porém, os links relativos do "tipo 4" ainda estão quebrados (exceto o "caso B").<BASE HREF='http://www.example.com/some/dir/file.php>
: Exatamente. Tudo deve estar funcionando com este.Uma última nota
Lembre-se de que isso se aplica a todos os URLs do seu documento:
<A HREF=
<IMG SRC=
<SCRIPT SRC=
fonte
<SCRIPT SRC=
<BASE HREF='http://www.example.com/some/dir/file.php>
funcionaria com o "tipo 4"? Não, não seria como " example.com/some/dir/file.php?foo=bar " em vez de example.com/subdir/page.html?foo=barhttp://www.example.com/some/dir/file.php
é o "local real" (consulte "um exemplo explica melhor"), e passar apenas um fragmento (#anchor
) só pode ser resolvido lá.Drupal inicialmente contou com a
<base>
tag e, posteriormente, tomou a decisão de não usar devido a problemas com rastreadores e caches HTTP.Geralmente não gosto de postar links. Mas vale a pena compartilhar este, pois pode beneficiar quem procura os detalhes de uma experiência do mundo real com a
<base>
tag:http://drupal.org/node/13148
fonte
<base>
implementação baseada, não apenas para que suas âncoras funcionem corretamente no seu navegador.Facilita as páginas para visualização offline; você pode colocar o URL completo na tag base e seus recursos remotos serão carregados corretamente.
fonte
Atualmente, o hash "#" funciona para links de salto em conjunto com o elemento base, mas apenas nas versões mais recentes do Google Chrome e Firefox, NÃO do IE9.
O IE9 parece fazer com que a página seja recarregada, sem pular para qualquer lugar. Se você estiver usando links de salto na parte externa de um iframe, enquanto instrui o quadro a carregar os links de salto em uma página separada dentro do quadro, você obterá uma segunda cópia da página do link de salto carregada dentro do quadro.
fonte
Provavelmente não é muito popular porque não é bem conhecido. Eu não teria medo de usá-lo, pois todos os principais navegadores o suportam.
Se o seu site usa AJAX, você deve garantir que todas as suas páginas estejam configuradas corretamente ou você pode acabar com links que não podem ser resolvidos.
Apenas não use o
target
atributo em uma página HTML 4.01 Strict.fonte
base
tags.No caso de imagens SVG destacadas na página, há outra questão importante que surge quando a
base
tag é usada:Como com a
base
tag (como já mencionado acima), você perde efetivamente a capacidade de usar URLs de hash relativos, como em<a href="#foo">
porque eles serão resolvidos com base no URL base e não na localização do documento atual e, portanto, não serão mais relativos. Portanto, você precisará adicionar o caminho do documento atual a esses tipos de links, como em
<a href="https://stackoverflow.com/path/to/this/page/name.html#foo">
Portanto, um dos aspectos aparentemente positivos da
base
tag (que é afastar os prefixos de URL longos da tag de âncora e obter âncoras mais curtas e agradáveis) sai pela culatra para URLs de hash locais.Isso é especialmente irritante ao incluir SVG em sua página, seja SVG estático ou SVG gerado dinamicamente, porque no SVG pode haver muitas dessas referências e todas elas serão quebradas assim que uma
base
tag for usada, na maioria, mas nem todos os usuários implementações de agentes (o Chrome pelo menos ainda funciona nesses cenários no momento da redação).Se você estiver usando um sistema de modelo ou outra cadeia de ferramentas que processa / gera suas páginas, eu sempre tentava me livrar da
base
tag, porque, a meu ver, ela traz mais problemas à tabela do que resolve.fonte
Além disso, lembre-se de que, se você executar o servidor da Web em uma porta não padrão, também precisará incluir o número da porta na base href:
fonte
Eu realmente nunca vi um ponto em usá-lo. Oferece muito pouca vantagem e pode até tornar as coisas mais difíceis de usar.
A menos que você tenha centenas ou milhares de links, todos no mesmo subdiretório. Em seguida, você poderá economizar alguns bytes de largura de banda.
Como uma reflexão tardia, eu me lembro de haver algum problema com a tag no IE6. Você pode colocá-los em qualquer lugar do corpo, redirecionando diferentes partes do site para diferentes locais. Isso foi corrigido no IE7, que quebrou muitos sites.
fonte
base
tag é uma solução para alguns problemas. Se você não tiver um problema, não use abase
tag. Exemplos: 1. Reutilizando o conteúdo HTML em diferentes sistemas. Os links são mantidos relativos no conteúdo e umabase
tag apropriada é definida (pelo CMS) para que os links sejam resolvidos corretamente. 2. Um site existente usa URLs relativos, mas depois decide implementar URLs "bonitas", que alteram a profundidade do caminho da URL. Umabase
tag pode ser vista como preferível a "consertar" todos os URLs relativos.Também temos um site em que a tag de base é usada e o problema descrito ocorreu. (após a atualização do jquery), foi possível corrigi-lo com URLs de guia como este:
isso os torna "locais"
referências que eu usei:
http://bugs.jqueryui.com/ticket/7822 http://htmlhelp.com/reference/html40/head/base.html http://tjvantoll.com/2013/02/17/using-jquery-ui- tabs-with-the-base-tag /
fonte
Trabalhando com AngularJS, a tag BASE quebrou $ cookieStore silenciosamente e demorei um pouco para descobrir por que meu aplicativo não conseguia mais escrever cookies. Esteja avisado...
fonte
Uma coisa a ter em mente:
Se você desenvolver uma página da Web a ser exibida no UIWebView no iOS, precisará usar a tag BASE. Simplesmente não funcionará de outra maneira. Seja JavaScript, CSS, imagens - nenhuma delas funcionará com links relativos em UIWebView, a menos que a tag BASE seja especificada.
Eu já fui pego por isso antes, até descobrir.
fonte
Eu encontrei uma maneira de usar
<base>
e ancorar links baseados. Você pode usar o JavaScript para manter os links#contact
funcionando como eles precisam. Usei-o em algumas páginas de paralaxe e funciona para mim.Você deve usar no final da página
fonte
Minha recomendação é NÃO usar o
<base>
elemento no gerenciamento de caminhos de URL . Por quê?Apenas troca um problema por outro. Sem o elemento base, você pode usar qualquer sistema de caminhos que desejar para seus caminhos e links relativos, sem medo de que eles quebrem. No minuto em que você define o elemento base para um caminho, você está "bloqueado" para projetar todos os seus URLs para trabalharem fora desse caminho e agora terá que alterar TODOS os caminhos para trabalhar a partir do caminho base. Péssima ideia!
Isso significa que você deve agora escrever caminhos mais longos e acompanhar onde cada caminho é relativo a essa base. Pior ..... ao usar o
<base>
elemento, eles recomendam que você use um caminho de base totalmente qualificado para oferecer suporte a navegadores mais antigos (" https://www.example.com/ "), então agora você codificou seu domínio no seu página ou tornou todos os seus links dependentes de um caminho de domínio válido.Por outro lado, no minuto em que você remove o caminho base novamente do seu site, agora você está livre novamente para usar caminhos relativos mais curtos, que podem ser totalmente qualificados, usar caminhos absolutos da raiz ou usar caminhos verdadeiramente relativos ao arquivo e pasta em que você está. É muito mais flexível. E o melhor de todos os fragmentos, como "#hello", funciona corretamente sem nenhuma correção adicional. Mais uma vez, as pessoas estão criando problemas que não existem.
Além disso, o argumento acima de que você usa URLs de base para ajudá-lo a migrar pastas de páginas da Web para novos locais de subpastas não importa hoje, pois a maioria dos servidores modernos permite que você configure rapidamente qualquer subpasta como uma nova pasta raiz do aplicativo em qualquer domínio. A definição ou a "raiz" de um aplicativo Web não é restrita por pastas ou domínios agora.
Parece meio bobo todo esse debate. Então, eu digo: deixe de fora a URL base e ofereça suporte ao sistema de caminho padrão servidor-cliente nativo mais antigo que não a usa.
Nota: Se o problema que você tem é controlar caminhos devido a algum novo sistema de API, a solução é simples ... seja consistente em como você localiza todos os seus URLs e links em sua API. Não confie no suporte do navegador aos truques base ou HTML5 ou mais recentes do circo, como fazem as crianças da API javascript. Simplesmente localize todas as suas tags âncora de forma consistente e você nunca terá problemas. Além disso, seu aplicativo da Web é instantaneamente portátil para novos servidores, independentemente dos sistemas de caminho usados.
O que é velho é novo de novo! O elemento base é claramente sobre tentar criar uma solução para um problema que nunca existiu no mundo da Web há 20 anos, muito menos hoje.
fonte
Exemplo de base href
Diga uma página típica com links:
.e links para uma pasta diff:
Com o href base , podemos evitar repetir a pasta base:
Portanto, isso é uma vitória. No entanto, as páginas geralmente contêm URLs para bases de diferenças. E a web atual suporta apenas uma base href por página ; portanto, a vitória é rapidamente perdida como bases que não são repetidas, por exemplo:
Conclusão
( O destino base pode ser útil.) O href base é inútil como:
Relacionado
fonte