Html <base> etiketi için öneriler nelerdir?


462

Daha önce hiçbir yerde kullanılan <base>HTML etiketini hiç görmedim . Kullanımından kaçınmam gerektiği anlamına gelen tuzaklar var mı?

Modern bir üretim sitesinde (veya herhangi bir sitede) kullanımda hiç fark etmediğim gerçeği, beni temkinli kılıyor, ancak sitemdeki bağlantıları basitleştirmek için yararlı uygulamalara sahip olabilir.


Düzenle

Birkaç hafta boyunca temel etiketi kullandıktan sonra, ilk göründüğünden çok daha az arzu edilir hale getiren temel etiketi kullanarak bazı büyük gotcha'lar buldum . Temel olarak, temel etiketteki href='#topic've href=''altındaki değişiklikler varsayılan davranışlarıyla çok uyumlu değildir ve varsayılan davranıştan kaynaklanan bu değişiklik, kontrolünüz dışındaki üçüncü taraf kitaplıklarını kolayca güvenilmez hale getirebilir beklenmedik şekillerde, çünkü mantıksal olarak varsayılan davranışa bağlı olacaklardır. Genellikle değişiklikler incedir ve büyük bir kod tabanı ile uğraşırken hemen belirgin olmayan sorunlara yol açar. O zamandan beri aşağıda yaşadığım sorunları ayrıntılı olarak açıklayan bir cevap oluşturdum. Bu yüzden <base>, benim yeni tavsiyem, yaygın bir dağıtım yapmadan önce bağlantı sonuçlarını kendiniz test edin !


12
Genellikle bağlantıları çalışır tutmak için arama motoru sonuçlarının önbelleğe alınmış sürümlerinde kullanılır.
Gumbo

11
Sadece not etmek için: Temel etiket aynı zamanda basit bağlantılarla da etkileşime girer, bu nedenle taban kullanırsanız, daha önce sayfadaki bir konuma yalnızca bir bağlantı <a href='#anchor1'>Anchor1</a>olan şey temel etiketi de kullanır ve geçerli sayfaya şu şekilde gönderme varsayılan davranışını geçersiz kılar baz. Bu kesinlikle dikkat edilmesi gereken bir şey (yine de çok fazla çapa kullanan sayfalarda başka bir temel etiket kullanılarak düzeltilebilir).
Kzqai

1
Kabul edilen cevaptan memnun değilseniz, neden kabul etmiyor ve yeniden atamıyorsunuz?
Pops

1
Bunun bir seçenek olduğunun farkında değildim, ama evet, fahişe yapmak istemiyorum (bana puan verirse), ama son analizde dezavantajların avantajlardan daha ağır bastığını ve bunu vurgulamak istiyorum.
Kzqai

2
Genellikle gittiğiniz her büyük sitenin kaynak koduna bakmazsınız. Sanırım düşündüğünüzden daha fazla insan kullanıyor <base>.
Mathias Lykkegaard Lorenzen

Yanıtlar:


259

<base>Etiketin kullanılıp kullanılmayacağına karar vermeden önce , nasıl çalıştığını, ne için kullanılabileceğini ve ne anlama geldiğini anlamanız ve nihayetinde avantajlardan / dezavantajlardan ağır basmanız gerekir.


<base>Etiket esas olarak mevcut bağlamda ilgili endişe gerekmez olarak dilleri templating göreli bağlantılar oluşturarak kolaylaştırır her linke.

Örneğin yapabilirsin

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

onun yerine

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

<base href>Değerin eğik çizgi ile biteceğini lütfen unutmayın , aksi takdirde son yola göre yorumlanacaktır.


Tarayıcı uyumluluğuna gelince, bu yalnızca IE'de sorunlara neden olur. <base>HTML olarak Belirttiğiniz içinde etikettir değil bir uç etiketi sahip </base>sadece kullanımına yasal yüzden, <base>bir uç etiketi olmadan. Ancak IE6 farklı düşünüyor ve tüm içeriği sonra<base> etiketi olarak yerleştirilen böyle durumda olan çocuğa ait <base>HTML DOM ağacındaki eleman. Bu, ilk bakışta Javascript / jQuery / CSS'de açıklanamayan sorunlara neden olabilir, yani html>bodyHTML DOM denetçisinde arasında bir base(ve head) olması gerektiğini keşfedene kadar, belirli seçicilerde öğelere tamamen erişilemez .

Yaygın bir IE6 düzeltmesi, bitiş etiketini eklemek için bir IE koşullu yorumu kullanıyor:

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

W3 Doğrulayıcı'yı umursamıyorsanız veya zaten HTML5'deyseniz, kendi kendine kapatabilirsiniz, her webbrowser yine de onu destekler:

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

<base>Etiketi kapatmak, sonsuz bir döngüde göreli bir URI ile kaynak istemek için WinXP SP3'teki IE6'nın deliliğini anında düzeltir .<script>src

<base>Etikette <base href="https://stackoverflow.com//example.com/somefolder/">veya gibi göreli bir URI kullandığınızda başka bir potansiyel IE sorunu ortaya çıkar <base href="https://stackoverflow.com/somefolder/">. Bu IE6 / 7 / 8'de başarısız olacaktır. Ancak bu tam olarak tarayıcının hatası değildir; <base>etikette göreli URI'ler kullanmak tek başına yanlıştır. HTML4 özellikleri dolayısıyla ile başlanarak, bu mutlak bir tanım olması gerektiği belirtilir http://ya da https://şema. Bu, HTML5 spesifikasyonunda bırakılmıştır . Dolayısıyla, HTML5 kullanıyorsanız ve yalnızca HTML5 uyumlu tarayıcıları hedefliyorsanız, <base>etikette göreceli bir URI kullanarak her şey yolunda olmalıdır .


Gibi adlandırılmış / karma parçası çapaları kullanmakla ilgili olarak <a href="#anchor">, sorgu dizesi çapaları gibi <a href="?foo=bar">ve yol parçası çapaları gibi <a href=";foo=bar">, bu tür çapalar da dahil olmak üzere<base> temelde göreceli tüm bağlantıları bildirdiğiniz etiketle . Göreli bağlantıların hiçbiri artık geçerli istek URI'siyle ilişkili değildir ( etiket olmadan olacağı gibi ). Bu başlangıçta yeni başlayanlar için kafa karıştırıcı olabilir. Bu çapaları doğru şekilde oluşturmak için temel olarak URI'yi eklemeniz gerekir,<base>

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

burada ${uri}temel $_SERVER['REQUEST_URI']olarak PHP, ${pageContext.request.requestURI}JSP ve #{request.requestURI}JSF olarak tercüme edilir . JSF gibi MVC çerçevelerinin tüm bu kazan plakasını azaltan ve ihtiyacı ortadan kaldıran etiketlere sahip olması gerekir <base>. Ayrıca bkz . Diğer JSF sayfalarına bağlanmak / sayfalara gitmek için hangi URL kullanılır .


BalusC, Aynı zamanda cevabı buraya yazdığım sırada stackoverflow.com/a/46539210/632951 Bu konu altında <base> ile ilgili bilgileri detaylandırarak 8 yıldan fazla yazar tarafından yayınlanan 10'dan fazla yararlı yorum vardı. Yorumları bağlayan bir fikrin var mı?
Pacerier

162

Temel etiketin etkilerinin dökümü:

Temel etiket bazı sezgisel olmayan etkilere sahip gibi görünüyor ve güvenmeden önce sonuçların farkında olmanızı ve bunları kendiniz test etmenizi tavsiye ederim <base>! Onları farklı URL'lere sahip yerel siteleri işlemek için temel etiketi kullanmaya çalıştıktan sonra keşfettiğimden ve sadece dehşetime kadar sorunlu etkileri öğrendikten sonra, bu potansiyel tuzakların bu özetini başkaları için oluşturmaya zorlandığımı hissediyorum.

Ben <base href="http://www.example.com/other-subdirectory/">aşağıdaki durumlarda benim örnek olarak temel bir etiket kullanacağım ve kodun bulunduğu sayfanın http://localsite.com/original-subdirectory olduğunu iddia edeceğim

Majör:

Hiçbir bağlantı veya adlandırılmış bağlantı veya boş href, açıkça belirtilmedikçe orijinal alt dizini göstermez: Temel etiket, bunun yerine temel etiketin URL'sine aynı sayfa bağlantı bağlantıları da dahil olmak üzere her şeyi farklı şekilde bağlar, örneğin:

  • <a href='#top-of-page' title='Some title'>A link to the top of the page via a named anchor</a>
    olur
    <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>
    olur
    <a href='http://www.example.com/other-subdirectory/?update=1' title='Some title'>A link to the base tag's page instead</a>

Bazı çalışmalarda, bu bağlantıların üzerinde bulunduğunuz sayfaya açık bir şekilde bağlandığını belirterek, ancak standart davranışa dayanan karışıma üçüncü taraf kitaplıkları eklediğinizde, kontrol ettiğiniz bağlantılarda bu sorunları düzeltebilirsiniz, kolayca büyük karışıklığa neden olabilir.

Minör:

Koşullu yorum gerektiren IE6 düzeltme: IE6 yani dom hiyerarşi berbat önlemek için şartlı bir yorum gerektirir <base href="http://www.example.com/"><!--[if lte IE 6]></base><![endif]-->olarak BalusCyukarıda onun cevabını bahseder.

Genel olarak, her bağlantı üzerinde tam düzenleme kontrolünüz yoksa ve asıl korktuğum gibi, bu büyük bir sorun, bunu değerinden daha fazla sorun haline getirir. Şimdi gidip tüm kullanımlarımı yeniden yazmam gerekiyor! : p

"Parçalar" / karma kullanırken sorunlar için ilgili test bağlantıları:

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

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


Izzy tarafından düzenleyin: Herkesle ilgili yorumlarda benimle aynı kafa karışıklığı içinde:

Aşağıdaki sonuçlarla kendim test ettim:

  • sondaki eğik çizgi veya eğik çizgi, burada verilen örneklerde hiçbir fark yaratmaz ( #anchorve ?querysadece belirtilene eklenir <BASE>).
  • Ancak göreli bağlantılar için bir fark bulunmaktadır: eğik çizgi atlayarak other.htmlve dir/other.htmlen başlayacak DOCUMENT_ROOT, belirli bir örnek /other-subdirectorydosyası olarak işleme tabi tutuldu ve bu şekilde göz ardı (doğru) olması.

Dolayısıyla göreli bağlantılar için, BASEtaşınan sayfa ile iyi çalışır - çapa alırken ve ?queriesdosya adının açıkça belirtilmesi gerekir ( BASEsondaki eğik çizgi veya son kullanılan öğenin adına karşılık gelmeyen bir öğe).

Bunu <BASE>, tam URL'yi dosyanın kendisine (ve içinde bulunduğu dizine değil) değiştirmek olarak düşünün ve doğru olanı elde edersiniz. Bu örnekte kullanılan dosyanın other-subdirectory/test.html(yeni konuma taşındıktan sonra) olduğu varsayılarak, doğru belirtimin olması gerekirdi:

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

- et işte, her şey beklendiği gibi çalışır: #anchor, ?query, other.html, very/other.html, /completely/other.html.


27

Bir dakika. Temel etiketin bu kötü şöhreti hak ettiğini düşünmüyorum.

Temel etiketle ilgili güzel şey, daha az güçlükle karmaşık URL yeniden yazmalarını gerçekleştirmenize olanak vermesidir.

İşte bir örnek. Sen hamle karar http://example.com/product/category/thisproduct için http://example.com/product/thisproduct . .Htaccess dosyanızı ilk URL'yi ikinci URL'ye yeniden yazmak için değiştirirsiniz.

Taban etiketi yerinde olduğunda, .htaccess yeniden yazmanızı yaparsınız ve hepsi bu kadar. Sorun değil. Ancak temel etiket olmadan, tüm göreli bağlantılarınız kesilir.

URL yeniden yazma işlemleri genellikle gereklidir, çünkü bu ayarları değiştirmek sitenizin mimarisine ve arama motoru görünürlüğüne yardımcı olabilir. Doğru, millet tarafından belirtilen "#" ve '' sorunları için geçici çözümlere ihtiyacınız olacak. Ancak temel etiket, araç setinde bir yeri hak ediyor.


10
Benim görüşüme göre, sorun geleceğe hazırlanıyor. Bir sayfada temel etiketi kullanırsanız, çıplak bağlantı etiketinin veya karma değerlerinin varsayılan davranışına güvenebilecek üçüncü taraf kütüphaneleri de dahil olmak üzere, sayfa ile etkileşim kuran diğer tüm kütüphaneler temel etiketten etkilenir.
Kzqai

4
@Kzqai, +1 İyi bir nokta, ancak hatalı kütüphaneler kullanmayan birçok web sitesi var. Sorun temel href ile değil, kütüphane ile ve orada düzeltilmesi gerekiyor.
Pacerier

2
@ Pacer, sorunun gerçekten temel href ile olduğunu söyleyebilirim. Ya da daha doğrusu, tarayıcılar # ile başlayan çapa href'lerini etkilemeyecek kadar zeki görünmüyor. Javascript ile bu düzeltmek için çalıştı ve bu href='#'bağlantıları (örneğin bootstrap) kullanarak kütüphaneler ile sorunlara neden oldu . Kütüphaneleri suçlamak, HTML ile yanlış giden her şey için onları suçlamak gibidir. Modern bir iş için modası geçmiş bir araç, basit.
Deji

2
"karmaşık URL yeniden yazma işlemlerini daha az güçlükle yapar." - Bununla birlikte, bu durumda baseetiket, ilk etapta köke ilişkin URL'leri (veya mutlak URL'leri) (doğru bir şekilde) kullanmamak için tartışmalı bir çözümdür .
MrWhite

@Deji, "Sorun" yazdığımda, "böcek" demek istiyorum. Evet, baz href'in varlığı gerçekten de gerçek bir "problem" dir, ancak yukarıdaki durumda, hatanın baz href ile olmadığını söylüyorum. (Yine de temel href kullanarak destek düşünüyorum kereliğine değil, Nitekim, benim standı güncel versiyonda bu temel href faydasız olduğunu : stackoverflow.com/a/46539210/632951 . Yoludur ileriye şimdi iyi onu kaldırmayı Veya birden etkinleştirmek baz hrefs sadece çoklu kullanılabilir olduğunda yararlıdır)
Pacerier

22

Kullanılıp kullanılmayacağına karar vermek için ne yaptığının ve gerekli olup olmadığının farkında olmalısınız. Bu, ben de katkıda bulunduğum bu cevapta kısmen açıklanmıştır . Ancak anlaşılmasını ve takip edilmesini kolaylaştırmak için, burada ikinci bir açıklama. İlk önce anlamamız gerekir:

Bağlantılar <BASE>kullanılmadan tarayıcı tarafından nasıl işlenir ?

Bazı örnekler için, şu URL'lere sahip olduğumuzu varsayalım:

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'nin her ikisi de aynı dosyaya ( index.html) tarayıcıya gönderilir, elbette C gönderir page.htmlve D gönderir /subdir/page.html.

Ayrıca, her iki sayfanın da bir dizi bağlantı içerdiğini varsayalım:

1) tam nitelikli mutlak bağlantılar ( http://www...)
2) yerel mutlak bağlantılar ( /some/dir/page.html)
3) dosya adları da dahil göreli bağlantılar ( dir/page.html) ve
4) yalnızca "segmentler" içeren göreli bağlantılar ( #anchor, ?foo=bar).

Tarayıcı sayfayı alır ve HTML'yi oluşturur. Bir URL bulursa, onu nereye yönlendireceğini bilmelidir. Bu, Bağlantı 1) için olduğu gibi her zaman açıktır. Diğerleri, oluşturulan sayfanın URL'sine bağlıdır:

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

Şimdi ne gibi değişiklikler ile <BASE> kullanılıyor?

<BASE>URL'nin tarayıcıya göründüğü şekliyle değiştirilmesi gerekiyor . Böylece tüm bağlantılar, kullanıcı belirtilen URL'yi çağırmış gibi görünür <BASE>. Bu, diğer cevapların bazılarındaki karışıklığı açıklıyor:

  • yine, "tam nitelikli mutlak bağlantılar" ("tip 1") için hiçbir şey değişmez
  • yerel mutlak bağlantılar için, hedeflenen sunucu değişebilir (içinde belirtilen sunucu<BASE> başlangıçta kullanıcıdan çağrılandan farklıysa)
  • göreli URL'ler burada kritik hale gelir, bu nedenle nasıl ayarladığınıza özellikle dikkat etmelisiniz <BASE>:
    • bir dizine ayarlamak daha iyi . Bunu yaparsanız, "tip 3" bağlantıları çalışmaya devam edebilir, ancak kesinlikle "tip 4" bağlantılarını keser ("durum B" hariç)
    • olarak ayarlayın tam dosya adı , çoğu durumda, istenen sonuçları üretmektedir.

Bir örnek bunu en iyi açıklar

Şunu kullanarak bazı URL'leri "önceden" belirtmek istediğinizi varsayalım mod_rewrite:

  • gerçek dosya: <DOCUMENT_ROOT>/some/dir/file.php?lang=en
  • gerçek URL: http://www.example.com/some/dir/file.php?lang=en
  • kullanıcı dostu URL: http://www.example.com/en/file

Kullanıcı dostu URL'yi gerçek olana şeffaf bir şekilde yeniden yazmak için mod_rewritekullanıldığını varsayalım (harici yeniden yönlendirme yok, bu yüzden "kullanıcı dostu" gerçek adres yüklenirken tarayıcı adres çubuğunda kalır). Şimdi ne yapmalı?

  • hayır <BASE>belirtilen: sonları tüm göreli bağlantılar (bunlar dayalı olacağını olarak http://www.example.com/en/fileşimdi)
  • <BASE HREF='http://www.example.com/some/dir>: Kesinlikle yanlış. belirtilen URL'nin dosya kısmı dirolarak kabul edilir , bu nedenle yine de tüm göreli bağlantılar kesilir.
  • <BASE HREF='http://www.example.com/some/dir/>: Daha iyisi. Ancak "tip 4 "'ün göreli bağlantıları hala kesiktir (" durum B "hariç).
  • <BASE HREF='http://www.example.com/some/dir/file.php>: Kesinlikle. Her şey bununla çalışıyor olmalı.

Son not

Bunun belgenizdeki tüm URL'ler için geçerli olduğunu unutmayın :

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

son notunuza atıfta bulunarak ... merak ediyorum .. bir jQuery ajax isteğinin yorumlanma şeklini de değiştiriyor mu? Bu farklı<SCRIPT SRC=
bkwdesign

@bkwdesign jQuery kullanmıyorum, ama varsayıyorum.
Izzy

@Izzy, Re "example" Aslında , </some/dir/file.php?lang=en> öğesini </ en / file> olarak güzel yaparsanız, </ some / dir / page2? Lang = en> ve </ some / dir / script> ve </ en / page2> ve </ en / script> 'e gidin. Böylece göreli yollarınız tam olması gerektiği gibi çalışır .
Pacerier

<BASE HREF='http://www.example.com/some/dir/file.php>"tip 4" ile nasıl çalışır? example.com/subdir/page.html?foo=bar
ANewGuyInTown

@ANewGuyInTown Evet ve olması gereken şey bu - örneğimde http://www.example.com/some/dir/file.phpolduğu gibi "gerçek konum" (bkz. "Bir örnek en iyi açıklar" bölümüne bakın) ve yalnızca bir fragmanın ( #anchor) iletilmesi yalnızca orada çözülebilir.
Izzy

12

Drupal başlangıçta <base>etikete dayanıyordu ve daha sonra HTTP tarayıcıları ve önbellekleriyle ilgili sorunlar nedeniyle kullanılmama kararını aldı.

Genellikle bağlantı göndermekten hoşlanmam. Ancak bu, <base>etiketle gerçek dünya deneyiminin ayrıntılarını arayanlara fayda sağlayabileceğinden gerçekten paylaşmaya değer :

http://drupal.org/node/13148


Bir tartışmaya bağlantı, bu cevaptan sekiz yıl önce oldu, bu yüzden şimdi neredeyse on yıl önce. Bence bu hala bir sorun varsa, var olmayan bir sorunun bu kadar eski bir tanımına bağlanmaktan ziyade yapılacak daha fazla test olmalı.
Sami Kuhmonen

Doğru, ancak IMHO , sadece çapanızın tarayıcınızda çalıştığı için değil , temel uygulamanızı test etmek için hangi sorunlara ihtiyacınız olduğu konusunda hala bir göz açıcı <base>.
Amr Mostafa

@AmrMostafa, Sadece baz href kullanmayın.
Pacerier

10

Çevrimdışı görüntüleme için sayfaları kolaylaştırır; tam URL'yi temel etikete koyabilirsiniz, ardından uzak kaynaklarınız düzgün şekilde yüklenir.


@Erik, Çevrimdışı görüntülemenin yanı sıra, bir alanın başka bir alandaki bir sayfasını demo olarak göstermesi gereken tüm stopgap kullanımları için de çalışır. Örneğin, bir sayfayı jsfiddle üzerinde demo yaparken, alan adınızı temel almak için jsfiddle'ın alanı yerine base href kullanabilirsiniz. Speaking Gerçekçi olarak konuşulsa da, sadece bu tür stopgap kullanımları için bir etiket oluşturmak iyi bir tasarım değildir, bu nedenle bu tür stopgap kullanımları için yararlı olsa bile temel href kullanımdan kaldırılmalı ve kaldırılmalıdır.
Pacerier

5

"#" Karması şu anda temel öğeyle birlikte atlama bağlantıları için çalışıyor, ancak yalnızca IE9 değil Google Chrome ve Firefox'un en son sürümlerinde.

IE9, herhangi bir yere atlamaksızın sayfanın yeniden yüklenmesine neden oluyor gibi görünüyor. Bir iframe'in dışında atlama bağlantıları kullanıyorsanız, atlama bağlantılarını çerçevenin içindeki ayrı bir sayfaya yüklemek için çerçeveyi yönlendirirken, bunun yerine çerçevenin içine yüklenen atlama bağlantısı sayfasının ikinci bir kopyasını alırsınız.


5

Muhtemelen çok popüler değil çünkü iyi bilinmiyor. Tüm büyük tarayıcılar desteklediği için kullanmaktan korkmam.

Siteniz AJAX kullanıyorsa, tüm sayfalarınızın doğru şekilde ayarlandığından emin olmak istersiniz, aksi takdirde çözümlenemeyen bağlantılar elde edebilirsiniz.

targetHTML 4.01 Katı sayfasındaki niteliği kullanmayın .


Aslında temel hedef yararlı olabilir, ancak basehref değildir. Gerçekten de popüler değil çünkü faydalı değil . Benim ans'ımı görün.
Pacerier

Artık tüm tarayıcılar baseetiketi destekliyor .
Vitaly Zdanevich

3

Sayfada satır içi SVG görüntüleri olması durumunda, baseetiket kullanıldığında ortaya çıkan başka bir önemli sorun daha vardır :

İle yana base(zaten yukarıda belirtildiği gibi) etiketinde etkili olduğu gibi göreli karma URL'ler kullanma olanağı gevşek

<a href="#foo">

çünkü geçerli belgenin konumu yerine temel URL'ye göre çözümlenecekler ve bu nedenle artık göreceli olmayacaklardır. Bu nedenle, mevcut belgenin yolunu aşağıdaki gibi bu tür bağlantılara eklemeniz gerekir

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

Yani, görünüşte olumlu yönlerden biri, base etiketin (uzun URL öneklerini bağlantı etiketinden uzağa taşımak ve daha güzel, daha kısa çapa almak) yerel karma URL'ler için tamamen geri teper.

Bu, SVG'de statik SVG veya dinamik olarak oluşturulmuş SVG olsun, sayfanızda SVG'yi satırlaştırırken özellikle can sıkıcıdır çünkü SVG'de bu tür birçok referans olabilir ve bir baseetiket kullanılır kullanılmaz, çoğu kullanıcı için değil, tüm kullanıcılarda kırılacaktır. aracı uygulamaları (Chrome en azından bu senaryolarda yazıldığı sırada hala çalışır).

Sayfalarınızı işleyen / üreten bir şablonlama sistemi veya başka bir araç zinciri kullanıyorsanız, her zaman baseetiketten kurtulmaya çalışırım , çünkü gördüğüm gibi tabloya çözdüğünden daha fazla sorun getirir.


SVG ile veya SVG olmadan, temel etiket işe yaramaz ve zararlı olarak kabul edilir . Ayrıntılarımı görün: stackoverflow.com/a/46539210/632951
Pacerier

3

Ayrıca, web sunucunuzu standart olmayan bir bağlantı noktasında çalıştırırsanız, bağlantı noktası numarasını temel href'e de eklemeniz gerektiğini unutmayın:

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

2

Bunu kullanmak için hiçbir zaman gerçekten bir nokta görmedim. Çok az avantaj sağlar ve işleri daha da zorlaştırabilir.

Yüzlerce veya binlerce bağlantıya sahip olmadığınız sürece, hepsi aynı alt dizine. O zaman size birkaç bayt bant genişliği kazandırabilir.

Bir sonradan, IE6 etiketi ile bazı sorun olduğunu hatırlamak gibi görünüyor. Onları vücudun herhangi bir yerine yerleştirerek sitenin farklı bölümlerini farklı konumlara yönlendirebilirsiniz. Bu, birçok siteyi bozan IE7'de düzeltildi.


3
Avantaj muhtemelen bant genişliğinden değil, daha temiz ve daha kısa URL'lerden tasarruf sağlar. Ne yazık ki, tüm bağlantılarda davranıştaki küçük değişiklikler gerçekten buna değmez, ortaya çıkıyor.
Kzqai

1
baseEtiket bazı sorunlara bir çözümdür. Bir sorununuz yoksa baseetiketi kullanmayın . Örnekler: 1. HTML içeriğini farklı sistemlerde yeniden kullanma. Bağlantılar içerikte göreli olarak tutulur ve base(CMS tarafından) uygun bir etiket ayarlanır, böylece bağlantılar doğru bir şekilde çözülür. 2. Mevcut bir site, göreli URL'ler kullanır ancak daha sonra URL yolu derinliğini değiştiren "güzel" URL'ler uygulamaya karar verir. Bir baseetiket, ilgili tüm URL'leri "düzeltmeye" tercih edilebilir.
MrWhite

@MrWhite, HTML zaten geçerli klasörü varsayılan göreceli yolları desteklediğinden , CMS'nin bağlantıları doğru bir şekilde çözmek için temel etiketi kullanması gerekmez . Buradaki ayrıntılara bakın: stackoverflow.com/a/46539210/632951
Pacerier

1
@Pacerier İçeriğin bulunduğu yere bağlıdır (FWIW WordPress ve diğerlerine değinmiyorum).
MrWhite

@MrWhite tipik olarak bir CMS ilk etapta statik bağlantılar kullanmayacaktır, bu yüzden bu örnek biraz gariptir. Aslında, günümüzde çok az sayıda web sitesi statik HTML kullanılarak oluşturulmuştur. - Burada puanlarınızı görebiliyorum, ama bunlar artık eskimiş olan sorunların çözümleri. (Herkes ve büyükanne ve büyükbabaları her şey için WordPress veya benzeri bir şey kullanıyor.)
Atli


2

AngularJS ile çalışmak BASE etiketi $ cookieStore'u sessizce kırdı ve uygulamamın neden çerez yazamayacağını anlamak biraz zaman aldı. Dikkatli olun ...


1

Akılda tutulması gereken bir şey:

İOS'ta UIWebView içinde görüntülenecek bir web sayfası geliştirirseniz, BASE etiketini kullanmanız gerekir. Başka türlü çalışmaz. JavaScript, CSS, resimler olsun - BASE etiketi belirtilmedikçe hiçbiri UIWebView altındaki göreli bağlantılarla çalışmaz.

Bunu öğrenene kadar daha önce yakalandım.


1

Bağlantıları kullanmanın <base>ve tutturmanın bir yolunu buldum . Bağlantıları gerektiği gibi #contactçalışmak için JavaScript'i kullanabilirsiniz . Bazı paralaks sayfalarında kullandım ve benim için çalışıyor.

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

Sayfanın sonunda kullanmalısınız


0

Benim tavsiyem öğeyi url yollarını yönetmede KULLANMAMAK<base> . Neden?

Bu sadece bir problemi diğeri için işlemektedir. Temel eleman olmadan, göreceli yollarınız ve bağlantılarınız için istediğiniz herhangi bir yol sistemini, korkacaklarından korkmadan kullanabilirsiniz. Temel öğeyi, tüm URL'lerinizi bu yoldan çalışacak şekilde tasarlamak için "kilitli" bir yola ayarladığınız dakika ve şimdi temel yoldan çalışmak için TÜM yolları değiştirmeniz gerekecektir. Kötü bir fikir!

Bu, artık UZUN yollar yazmanız ve her bir yolun bu tabana göre nerede olduğunu takip etmeniz gerektiği anlamına gelir. Daha da kötüsü ... <base>öğeyi kullanırken eski tarayıcıları desteklemek için tam nitelikli bir temel yol kullanmanızı öneririz (" https://www.example.com/ ") , böylece artık alan adınızı sitenize sabit olarak kodladınız. veya tüm bağlantılarınızı geçerli bir alan yoluna bağımlı hale getirdi.

Öte yandan, temel yolu tekrar web sitenizden kaldırdığınızda, artık tam olarak nitelendirilebilecek daha kısa göreli yollar kullanmak, kökten mutlak yollar kullanmak veya gerçekten dosya ve klasör içinde. Çok daha esnek. Ve "#hello" gibi tüm parçaların en iyisi, herhangi bir ek düzeltme olmadan doğru şekilde çalışır. Yine insanlar var olmayan sorunlar yaratıyorlar.

Ayrıca, çoğu modern sunucu, herhangi bir alt klasörü hızlı bir şekilde herhangi bir etki alanı altında yeni bir uygulama kök klasörü olarak ayarlamanıza izin verdiğinden, web sayfaları klasörlerini yeni alt klasör konumlarına geçirmenize yardımcı olması için temel URL'lerinizi kullanmanızın yukarıdaki argümanı bugün gerçekten önemli değildir. Bir web uygulamasının tanımı veya "kökü" artık klasörler veya etki alanları tarafından kısıtlanmamaktadır.

Bu tartışmaların hepsi aptalca görünüyor. Bu yüzden temel URL'yi dışarıda bırak ve bunu kullanmayan eski yerel sunucu-istemci varsayılan yol sistemini destekliyorum.

Not: Sahip olduğunuz sorun bazı yeni API sistemlerinden dolayı yolları kontrol ediyorsa, çözüm basittir ... API'nizdeki tüm URL'lerinizi ve bağlantılarınızı nasıl yönlendirdiğinizle tutarlı olun. Temel API veya HTML5 veya javascript API'sı çocukların yaptığı gibi daha yeni sirk numaralarının tarayıcı desteğine güvenmeyin. Tüm bağlantı etiketlerinizi tutarlı bir şekilde yönlendirin ve asla sorun yaşamayacaksınız. Dahası, kullanılan yol sistemlerinden bağımsız olarak web uygulamanız yeni sunuculara anında taşınabilir.

Ne eski yine yeni! Temel unsur, 20 yıl önce Web Dünyasında hiç bulunmayan bir soruna bugün çok daha az bir çözüm üretmeye çalışmakla ilgilidir.


-1

Temel href örneği

Bağlantıları olan tipik bir sayfa söyleyin:

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

.ve bir diff klasörüne bağlantılar:

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

Base href ile temel klasörü tekrarlamaktan kaçınabiliriz :

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

Yani bu bir kazanmadır, ancak sayfalar genellikle tabanları zorlamak için URL'leri içerir ve mevcut web sayfa başına yalnızca bir baz href'i destekler , bu nedenle kazanç, base hrefed'in tekrarladığı bazlar olarak hızlı bir şekilde kaybolur, örneğin:

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


Sonuç

( Temel hedef yararlı olabilir.) Temel href şu şekilde işe yaramaz :

  • Sayfa şu şekilde eşit ISLAK :
    • varsayılan taban [–parlak klasör] ⇌ mükemmel (gereksiz / nadir istisnalar 𝒞1 & 𝒞2 olmadığı sürece ).
    • geçerli web ⇌ çoklu baz hrefs desteklenmiyor .

İlişkili


@Downvoters'ın basehref'in ne kadar yararlı olduğunu açıklayamayacağı kesin, özellikle de tüm endüstriler yaygın olarak kullanılmasını öneriyorsa.
Pacerier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.