Apa rekomendasi untuk tag html <base>?

462

Saya belum pernah melihat <base>tag HTML benar-benar digunakan di mana pun sebelumnya. Apakah ada jebakan dalam penggunaannya yang berarti saya harus menghindarinya?

Fakta bahwa saya belum pernah melihatnya digunakan di situs produksi modern (atau situs apa pun) membuat saya curiga, meskipun sepertinya itu mungkin memiliki aplikasi yang berguna untuk menyederhanakan tautan di situs saya.


Edit

Setelah menggunakan tag dasar selama beberapa minggu, saya akhirnya menemukan beberapa gotcha utama dengan menggunakan tag dasar yang membuatnya jauh lebih tidak diinginkan daripada yang pertama kali muncul. Pada dasarnya, perubahan ke href='#topic'dan di href=''bawah tag dasar sangat tidak kompatibel dengan perilaku default mereka, dan perubahan dari perilaku default ini dapat dengan mudah membuat pustaka pihak ketiga di luar kendali Anda menjadi sangat tidak dapat diandalkan. dengan cara yang tidak terduga, karena mereka akan secara logis bergantung pada perilaku default. Seringkali perubahannya halus dan mengarah ke masalah yang tidak langsung terlihat ketika berhadapan dengan basis kode besar. Saya telah menciptakan jawaban yang merinci masalah yang saya alami di bawah ini. Jadi, uji sendiri hasil tautannya sebelum Anda berkomitmen untuk penyebaran yang luas <base>, adalah saran baru saya!

Kzqai
sumber
12
Ini sering digunakan dalam versi cache dari hasil mesin pencari untuk menjaga agar tautan tetap berfungsi.
Gumbo
11
Sebagai catatan: Tag dasar juga berinteraksi dengan jangkar sederhana, jadi jika Anda menggunakan basis, apa yang sebelumnya hanya jangkar ke lokasi pada halaman <a href='#anchor1'>Anchor1</a>akan menggunakan tag dasar juga, mengesampingkan perilaku default merujuk ke halaman saat ini sebagai dasar. Jadi itu pasti sesuatu yang harus diwaspadai (meskipun bisa diperbaiki dengan menggunakan tag dasar lain di halaman yang menggunakan banyak jangkar).
Kzqai
1
Jika Anda tidak puas dengan jawaban yang diterima, mengapa Anda tidak menerima dan menugaskannya kembali?
Pops
1
Tidak sadar itu adalah pilihan, tapi ya, tidak ingin mengulangi pelacur (jika itu bahkan memberi saya poin), tapi saya pikir dalam analisis akhir, kerugiannya lebih besar daripada keuntungannya, dan ingin menyoroti itu.
Kzqai
2
Anda biasanya tidak melihat kode sumber dari setiap situs utama yang Anda kunjungi. Saya percaya lebih banyak orang menggunakan <base>daripada yang Anda pikirkan.
Mathias Lykkegaard Lorenzen

Jawaban:

259

Sebelum memutuskan apakah akan menggunakan <base>tag atau tidak, Anda perlu memahami cara kerjanya, apa yang dapat digunakan untuk dan apa implikasinya dan akhirnya melebihi keuntungan / kerugiannya.


The <base>tag terutama memudahkan membuat link relatif template bahasa karena Anda tidak perlu khawatir tentang konteks saat ini di setiap link yang.

Anda bisa melakukannya misalnya

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

dari pada

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

Harap dicatat bahwa <base href>nilai berakhir dengan garis miring, jika tidak maka akan ditafsirkan relatif terhadap jalur terakhir.


Adapun kompatibilitas browser, ini hanya menyebabkan masalah di IE. The <base>tag di HTML ditetapkan sebagai tidak memiliki tag akhir </base>, jadi legit untuk hanya menggunakan <base>tanpa tag akhir. Namun IE6 berpikir lain dan seluruh isi setelah itu <base>tag dalam kasus seperti ditempatkan sebagai anak dari <base>elemen dalam pohon HTML DOM. Hal ini dapat menyebabkan pada pandangan pertama masalah yang tidak dapat dijelaskan dalam Javascript / jQuery / CSS, yaitu elemen yang sama sekali tidak dapat dijangkau dalam penyeleksi tertentu seperti html>body, sampai Anda menemukan di inspektur HTML DOM bahwa harus ada base(dan head) di antaranya.

Perbaikan IE6 yang umum adalah menggunakan komentar bersyarat IE untuk menyertakan tag akhir:

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

Jika Anda tidak peduli dengan W3 Validator, atau ketika Anda sudah menggunakan HTML5, maka Anda bisa menutup sendiri, setiap webbrowser mendukungnya:

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

Menutup <base>tag juga secara instan memperbaiki kegilaan IE6 pada WinXP SP3 untuk meminta <script>sumber daya dengan URI relatif di srcdalam loop tak terbatas.

Masalah IE potensial lainnya akan muncul ketika Anda menggunakan URI relatif di <base>tag, seperti <base href="https://example.com/somefolder/">atau <base href="https://stackoverflow.com/somefolder/">. Ini akan gagal di IE6 / 7/8. Namun ini bukan kesalahan browser; menggunakan URI relatif di <base>tag adalah salah sendiri. The spesifikasi HTML4 menyatakan bahwa itu harus menjadi URI mutlak, sehingga dimulai dengan http://atau https://skema. Ini telah dijatuhkan dalam spesifikasi HTML5 . Jadi jika Anda menggunakan HTML5 dan hanya menargetkan browser yang kompatibel dengan HTML5, maka Anda akan baik-baik saja dengan menggunakan URI relatif di <base>tag.


Untuk menggunakan jangkar fragmen bernama / hash seperti <a href="#anchor">, kueri jangkar seperti string dan jangkar <a href="?foo=bar">path fragmen seperti <a href=";foo=bar">, dengan <base>tag Anda pada dasarnya mendeklarasikan semua tautan relatif relatif terhadap itu, termasuk jenis jangkar tersebut. Tidak ada tautan relatif yang relatif terhadap URI permintaan saat ini lagi (seperti yang akan terjadi tanpa <base>tag). Ini mungkin pada awalnya membingungkan bagi pemula. Untuk membangun jangkar tersebut dengan cara yang benar, Anda pada dasarnya perlu menyertakan URI,

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

di mana ${uri}pada dasarnya diterjemahkan ke $_SERVER['REQUEST_URI']dalam PHP, ${pageContext.request.requestURI}di JSP, dan #{request.requestURI}di JSF. Perlu dicatat bahwa kerangka kerja MVC seperti JSF memiliki tag yang mengurangi semua boilerplate ini dan menghilangkan kebutuhan untuk <base>. Lihat juga ao URL apa yang digunakan untuk menautkan / menavigasi ke halaman JSF lainnya .

BalusC
sumber
BalusC, Tentang waktu yang sama ketika saya menulis jawabannya di sini stackoverflow.com/a/46539210/632951 ada lebih dari 10 komentar bermanfaat di bawah utas ini yang diposting oleh banyak penulis selama 8 tahun yang merinci informasi mengenai <base>. Adakah gagasan yang menautkan komentar yang telah dipindahkan?
Pacerier
162

Rincian efek dari tag dasar:

Tag dasar tampaknya memiliki beberapa efek non-intuitif, dan saya sarankan untuk mengetahui hasilnya dan mengujinya sendiri sebelum mengandalkan <base>! Karena saya telah menemukannya setelah mencoba menggunakan tag dasar untuk menangani situs lokal dengan url yang berbeda dan hanya menemukan efek yang bermasalah setelah, yang membuat saya kecewa, saya merasa terdorong untuk membuat ringkasan perangkap potensial ini untuk orang lain.

Saya akan menggunakan tag dasar: <base href="http://www.example.com/other-subdirectory/">sebagai contoh saya dalam kasus-kasus di bawah ini, dan akan berpura-pura bahwa halaman tempat kode tersebut adalah http://localsite.com/original-subdirectory

Utama:

Tidak ada tautan atau jangkar atau href kosong yang akan menunjuk ke subdirektori asli, kecuali jika dibuat eksplisit: Tag dasar membuat semua tautan berbeda, termasuk tautan jangkar halaman yang sama ke url tag dasar sebagai gantinya, misalnya:

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

Dengan beberapa pekerjaan, Anda bisa memperbaiki masalah ini pada tautan yang Anda kontrol, dengan secara eksplisit menentukan bahwa tautan ini terhubung ke halaman di mana mereka berada, tetapi ketika Anda menambahkan perpustakaan pihak ketiga ke dalam campuran yang bergantung pada perilaku standar, itu dapat dengan mudah menyebabkan kekacauan besar.

Minor:

Perbaikan IE6 yang memerlukan komentar bersyarat: Membutuhkan komentar bersyarat untuk ie6 untuk menghindari mengacaukan hirarki dom, yaitu <base href="http://www.example.com/"><!--[if lte IE 6]></base><![endif]-->seperti yang BalusCdisebutkan dalam jawabannya di atas.

Jadi secara keseluruhan, masalah utama membuat penggunaan menjadi rumit kecuali jika Anda memiliki kontrol pengeditan penuh atas setiap tautan, dan seperti yang saya khawatirkan pada awalnya, itu membuatnya lebih sulit daripada nilainya. Sekarang saya harus pergi dan menulis ulang semua kegunaan saya! : p

Tautan terkait pengujian untuk masalah saat menggunakan "fragmen" / hash:

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

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


Sunting oleh Izzy: Untuk Anda semua yang mengalami kebingungan yang sama dengan saya mengenai komentar:

Saya baru saja mengujinya sendiri, dengan hasil sebagai berikut:

  • mengikuti garis miring atau tidak, tidak ada bedanya dengan contoh-contoh yang diberikan di sini ( #anchordan ?queryhanya akan ditambahkan ke yang ditentukan <BASE>).
  • Namun itu membuat perbedaan untuk tautan relatif: menghilangkan garis miring, other.htmldan dir/other.htmlakan mulai DOCUMENT_ROOTdengan contoh yang diberikan, /other-subdirectorydiperlakukan (dengan benar) sebagai file dan dengan demikian dihilangkan.

Jadi untuk tautan relatif, BASEberfungsi baik dengan halaman yang dipindahkan - sementara jangkar dan ?queriesperlu nama file ditentukan secara eksplisit (dengan BASEmemiliki trailing slash, atau elemen terakhir yang tidak sesuai dengan nama file yang digunakannya).

Anggap saja <BASE>mengganti URL lengkap ke file itu sendiri (dan bukan direktori tempatnya berada), dan Anda akan memperbaikinya. Dengan asumsi file yang digunakan dalam contoh ini adalah other-subdirectory/test.html(setelah dipindahkan ke lokasi baru), spesifikasi yang benar seharusnya:

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

- et voila, semuanya bekerja seperti yang diharapkan: #anchor, ?query, other.html, very/other.html, /completely/other.html.

Kzqai
sumber
27

Tunggu sebentar. Saya pikir tag dasar tidak pantas menerima reputasi buruk ini.

Yang menyenangkan tentang tag dasar adalah memungkinkan Anda untuk melakukan penulisan ulang URL yang kompleks dengan lebih mudah.

Ini sebuah contoh. Anda memutuskan untuk memindahkan http://example.com/product/category/thisproduct ke http://example.com/product/thisproduct . Anda mengubah file .htaccess Anda untuk menulis ulang URL pertama menjadi URL kedua.

Dengan tag dasar di tempat, Anda melakukan penulisan ulang .htac Anda dan hanya itu. Tidak masalah. Tetapi tanpa tag dasar, semua tautan relatif Anda akan rusak.

Penulisan ulang URL sering diperlukan, karena mengubah mereka dapat membantu arsitektur situs Anda dan visibilitas mesin pencari. Benar, Anda akan membutuhkan solusi untuk masalah "#" dan "" yang disebutkan orang. Tetapi tag dasar layak mendapat tempat di toolkit.

Musim Panas
sumber
10
Dari pandangan saya, masalahnya adalah pembuktian di masa depan. Jika Anda menggunakan tag dasar pada halaman, semua perpustakaan lain yang berinteraksi dengan halaman tersebut akan dipengaruhi oleh tag dasar, termasuk perpustakaan pihak ketiga yang mungkin bergantung pada perilaku default tag anchor atau hash yang telanjang.
Kzqai
4
@Kzqai, +1 Poin bagus, tetapi ada banyak situs web yang tidak menggunakan pustaka yang cacat. Masalahnya bukan dengan base href, itu dengan perpustakaan dan perlu diperbaiki di sana.
Pacerier
2
@ Peracerier, saya akan mengatakan masalahnya memang dengan basis href. Atau lebih tepatnya, masalahnya adalah bahwa browser tampaknya tidak cukup pintar untuk tidak memengaruhi anchor href yang dimulai dengan #. Saya mencoba untuk memperbaikinya dengan javascript dan yang menyebabkan masalah dengan perpustakaan menggunakan href='#'tautan (bootstrap, misalnya). Menyalahkan perpustakaan seperti menyalahkan mereka untuk semua hal lain yang salah dengan HTML. Ini alat usang untuk pekerjaan modern, sesederhana itu.
Deji
2
"lakukan penulisan ulang URL yang kompleks dengan lebih mudah." - Meskipun, dalam hal ini basetag ini bisa dibilang solusi untuk tidak (benar) menggunakan URL relatif-root (atau bahkan URL mutlak) di tempat pertama.
MrWhite
@ Dji, Ketika saya menulis "masalah", maksud saya "bug". Ya, keberadaan basis href memang merupakan "masalah" nyata, tetapi dalam kasus di atas, saya katakan bug tidak dengan basis href. (Namun jangan sekali-sekali berpikir bahwa saya mendukung menggunakan basis href, Memang, pendirian saya adalah bahwa basis href dalam versi saat ini tidak berguna : stackoverflow.com/a/46539210/632951 . Cara terbaik ke depan sekarang adalah mencabutnya Atau mengaktifkan beberapa base hrefs karena ini hanya berguna ketika multiple dapat digunakan)
Pacerier
22

Untuk memutuskan apakah itu harus digunakan atau tidak, Anda harus mengetahui apa fungsinya dan apakah itu diperlukan. Ini sudah sebagian diuraikan dalam jawaban ini , yang saya juga berkontribusi. Tetapi untuk membuatnya lebih mudah dipahami dan diikuti, penjelasan kedua di sini. Pertama-tama kita perlu memahami:

Bagaimana tautan diproses oleh browser tanpa <BASE>digunakan?

Untuk beberapa contoh, mari kita asumsikan kita memiliki URL ini:

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 keduanya menghasilkan file yang sama ( index.html) dikirim ke browser, C tentu saja mengirim page.html, dan D mengirim /subdir/page.html.

Mari kita asumsikan lebih jauh, kedua halaman berisi serangkaian tautan:

1) tautan absolut yang sepenuhnya memenuhi syarat ( http://www...)
2) tautan absolut lokal ( /some/dir/page.html)
3) tautan relatif termasuk nama file ( dir/page.html), dan
4) tautan relatif dengan "segmen" saja ( #anchor, ?foo=bar).

Browser menerima halaman, dan merender HTML. Jika menemukan beberapa URL, ia perlu tahu ke mana harus mengarahkannya. Itu selalu jelas untuk Link 1), yang dianggap apa adanya. Semua yang lain bergantung pada URL halaman yang diberikan:

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

Sekarang apa perubahan dengan <BASE> yang digunakan?

<BASE>seharusnya mengganti URL seperti yang terlihat di browser . Jadi itu membuat semua tautan seolah-olah pengguna telah memanggil URL yang ditentukan dalam <BASE>. Yang menjelaskan beberapa kebingungan dalam beberapa jawaban lain:

  • lagi, tidak ada yang berubah untuk "tautan absolut berkualifikasi penuh" ("tipe 1")
  • untuk tautan absolut lokal, server yang ditargetkan mungkin berubah (jika yang ditentukan <BASE>berbeda dari yang dipanggil awalnya dari pengguna)
  • URL relatif menjadi kritis di sini, jadi Anda harus berhati-hati bagaimana Anda mengatur <BASE>:
    • lebih baik hindari pengaturan ke direktori . Dengan melakukan itu, tautan "tipe 3" mungkin terus berfungsi, tetapi dipastikan akan memutus tautan "tipe 4" (kecuali untuk "huruf B")
    • mengaturnya ke nama file yang sepenuhnya memenuhi syarat menghasilkan, dalam banyak kasus, hasil yang diinginkan.

Contoh menjelaskan itu yang terbaik

Katakanlah Anda ingin "mempoles" beberapa URL menggunakan mod_rewrite:

  • file asli: <DOCUMENT_ROOT>/some/dir/file.php?lang=en
  • URL asli: http://www.example.com/some/dir/file.php?lang=en
  • URL yang mudah digunakan: http://www.example.com/en/file

Mari kita asumsikan mod_rewritedigunakan untuk menulis ulang URL yang ramah-pengguna secara transparan ke yang asli (tidak ada arahan ulang eksternal, jadi yang "ramah-pengguna" tetap berada di bilah alamat peramban, sedangkan yang asli dimuat). Apa yang harus dilakukan sekarang?

  • tidak <BASE>ditentukan: mematahkan semua tautan relatif (karena akan didasarkan pada http://www.example.com/en/filesekarang)
  • <BASE HREF='http://www.example.com/some/dir>: Benar-benar salah. dirakan dianggap sebagai bagian file dari URL yang ditentukan, jadi tetap saja, semua tautan relatif rusak.
  • <BASE HREF='http://www.example.com/some/dir/>: Sudah lebih baik. Tetapi tautan relatif "tipe 4" masih terputus (kecuali untuk "huruf B").
  • <BASE HREF='http://www.example.com/some/dir/file.php>: Tepat. Semuanya harus bekerja dengan yang satu ini.

Catatan terakhir

Ingat ini berlaku untuk semua URL di dokumen Anda:

  • <A HREF=
  • <IMG SRC=
  • <SCRIPT SRC=
  • ...
Izzy
sumber
merujuk pada catatan terakhir Anda ... Saya ingin tahu .. apakah itu juga mengubah cara permintaan jQuery ajax akan ditafsirkan. Ini berbeda dengan<SCRIPT SRC=
bkwdesign
@ bkwdesign Saya tidak menggunakan jQuery, tapi saya anggap begitu.
Izzy
@Izzy, Re "example" Sebenarnya , jika Anda melakukan prettify </some/dir/file.php?lang=en> ke </ en / file>, Anda juga ingin prettify </ some / dir / page2? Lang = en> dan </ some / dir / script> ke </ en / page2> dan </ en / script>. Dengan demikian jalur relatif Anda akan bekerja seperti seharusnya .
Pacerier
bagaimana cara <BASE HREF='http://www.example.com/some/dir/file.php>kerjanya dengan "tipe 4"? bukankah itu tidak seperti " example.com/some/dir/file.php?foo=bar " alih-alih example.com/subdir/page.html?foo=bar
ANewGuyInTown
@ ANewGuyInTown Ya, dan itulah yang seharusnya - seperti dalam contoh saya http://www.example.com/some/dir/file.phpadalah "lokasi nyata" (lihat "contoh menjelaskannya dengan terbaik"), dan hanya melewati satu fragmen ( #anchor) hanya dapat diselesaikan di sana.
Izzy
12

Drupal awalnya mengandalkan <base>tag, dan kemudian mengambil keputusan untuk tidak menggunakan karena masalah dengan HTTP crawler & cache.

Saya biasanya tidak suka memposting tautan. Tapi yang ini benar-benar layak untuk dibagikan karena bisa bermanfaat bagi mereka yang mencari detail pengalaman dunia nyata dengan <base>tag:

http://drupal.org/node/13148

Amr Mostafa
sumber
Tautan menunjuk ke sebuah diskusi delapan tahun sebelum jawaban ini, jadi sekarang hampir satu dekade yang lalu. Saya pikir harus ada sedikit lebih banyak pengujian yang harus dilakukan jika ini masih merupakan masalah, daripada untuk menautkan ke deskripsi usia tua dari masalah yang mungkin tidak ada.
Sami Kuhmonen
Benar, tapi IMHO itu masih menjadi pembuka mata untuk masalah apa yang Anda butuhkan untuk menguji<base> implementasi berbasis Anda terhadap, bukan hanya bahwa jangkar Anda bekerja tepat di browser Anda.
Amr Mostafa
@ Ammostafa, Hanya saja, jangan gunakan base href.
Pacerier
10

Itu membuat halaman lebih mudah untuk dilihat secara offline; Anda dapat meletakkan URL yang sepenuhnya memenuhi syarat di tag dasar dan kemudian sumber daya jarak jauh Anda akan dimuat dengan benar.

Erik
sumber
@Erik, Selain dari penayangan offline, ini juga berfungsi untuk semua pengguna sementara yang perlu mendemonstrasikan halaman suatu domain di domain lain. Misalnya, saat mendemokan halaman di jsfiddle, Anda dapat menggunakan base href untuk mendasarkan domain Anda alih-alih domain jsfiddle. ΒΆ Meskipun berbicara secara realistis, membuat tag hanya untuk penggunaan sementara sementara bukan desain yang baik, sehingga basis href harus dihentikan dan dihapus meskipun itu dapat berguna untuk penggunaan sementara sementara.
Pacerier
5

Hash "#" saat ini berfungsi untuk lompatan tautan bersama dengan elemen dasar, tetapi hanya di versi terbaru Google Chrome dan Firefox, BUKAN IE9.

IE9 tampaknya menyebabkan halaman dimuat ulang, tanpa melompat ke mana pun. Jika Anda menggunakan tautan lompat di luar iframe, saat mengarahkan bingkai untuk memuat tautan lompat di halaman terpisah di dalam bingkai, Anda akan mendapatkan salinan kedua dari halaman tautan lompat yang dimuat di dalam bingkai.

Tristan
sumber
5

Ini mungkin tidak terlalu populer karena tidak terkenal. Saya tidak akan takut menggunakannya karena semua browser utama mendukungnya.

Jika situs Anda menggunakan AJAX, Anda harus memastikan semua halaman Anda sudah diatur dengan benar atau Anda bisa berakhir dengan tautan yang tidak dapat diselesaikan.

Hanya saja, jangan gunakan targetatribut di halaman Ketat HTML 4.01.

Ben S
sumber
Sebenarnya basetarget bisa berguna, tetapi basehref tidak. Memang, itu tidak populer karena tidak berguna . Lihat ans saya.
Pacerier
Sekarang semua browser mendukung basetag.
Vitaly Zdanevich
3

Dalam kasus gambar SVG yang digariskan di halaman ada masalah penting lain yang muncul ketika basetag digunakan:

Karena dengan basetag (seperti yang sudah disebutkan di atas) Anda secara efektif kehilangan kemampuan untuk menggunakan URL hash relatif seperti di

<a href="#foo">

karena mereka akan diselesaikan berdasarkan URL dasar daripada lokasi dokumen saat ini dan dengan demikian tidak relatif lagi. Jadi, Anda harus menambahkan jalur dokumen saat ini ke jenis tautan seperti di

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

Jadi salah satu aspek yang tampaknya positif dari basetag (yaitu memindahkan prefiks URL panjang dari tag anchor dan mendapatkan anchor yang lebih baik dan pendek) benar-benar menjadi bumerang untuk URL hash lokal.

Ini sangat menjengkelkan ketika menyejajarkan SVG di halaman Anda, baik itu SVG statis atau SVG yang dibuat secara dinamis karena dalam SVG mungkin ada banyak referensi seperti itu dan semuanya akan pecah begitu basetag digunakan, pada sebagian besar, tetapi tidak semua pengguna implementasi agen (Chrome setidaknya masih berfungsi dalam skenario ini pada saat penulisan).

Jika Anda menggunakan sistem templating atau rantai alat lain yang memproses / menghasilkan halaman Anda, saya akan selalu mencoba untuk menyingkirkan basetag, karena seperti yang saya lihat, itu membawa lebih banyak masalah ke tabel daripada memecahkannya.

Sebastian
sumber
Dengan atau tanpa SVG, tag dasar tidak berguna dan dianggap berbahaya . Lihat uraian saya: stackoverflow.com/a/46539210/632951
Pacerier
3

Juga, Anda harus ingat bahwa jika Anda menjalankan server web Anda pada port non-standar, Anda juga perlu memasukkan nomor port pada base href:

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

Saya tidak pernah benar-benar melihat titik menggunakannya. Memberikan sedikit keuntungan, dan bahkan mungkin membuat hal-hal lebih sulit untuk digunakan.

Kecuali jika Anda memiliki ratusan atau ribuan tautan, semua ke sub-direktori yang sama. Maka itu mungkin menghemat beberapa byte bandwidth.

Sebagai renungan, saya sepertinya ingat ada beberapa masalah dengan tag di IE6. Anda dapat menempatkannya di mana saja di badan, mengarahkan bagian situs yang berbeda ke lokasi yang berbeda. Ini diperbaiki di IE7, yang merusak banyak situs.

Atli
sumber
3
Keuntungannya mungkin bukan menghemat bandwidth, tetapi url yang lebih bersih dan lebih pendek. Sayangnya, perubahan halus dalam perilaku ke semua tautan benar-benar tidak sepadan, pada kenyataannya.
Kzqai
1
The basetag adalah solusi untuk beberapa masalah. Jika Anda tidak memiliki masalah maka jangan gunakan basetag. Contoh: 1. Menggunakan kembali konten HTML dalam sistem yang berbeda. Tautan disimpan relatif dalam konten dan basetag yang sesuai diatur (oleh CMS) sehingga tautan diselesaikan dengan benar. 2. Sebuah situs yang ada menggunakan URL relatif di seluruh tetapi kemudian memutuskan untuk mengimplementasikan URL "cantik" yang mengubah kedalaman jalur URL. Sebuah basetag dapat dilihat sebagai lebih baik untuk "memperbaiki" semua URL relatif.
MrWhite
@ MrWhite, CMS tidak perlu menggunakan tag dasar untuk menyelesaikan tautan dengan benar karena HTML sudah mendukung jalur relatif yang secara default ke folder saat ini. Lihat elaborasi di sini: stackoverflow.com/a/46539210/632951
Pacerier
1
@Pacerier Itu tergantung pada di mana konten berada (FWIW saya tidak merujuk ke WordPress et al).
MrWhite
@ MrWhite biasanya CMS tidak akan menggunakan tautan statis di tempat pertama, jadi contohnya agak aneh. Faktanya, sangat sedikit situs web yang dibangun menggunakan HTML statis. - Saya dapat melihat poin Anda di sana, tetapi itu adalah solusi untuk masalah yang pada dasarnya usang sekarang. (Semua orang dan kakek-nenek mereka menggunakan WordPress, atau serupa, untuk semuanya.)
Atli
2

punya juga situs tempat tag - dasar digunakan, dan masalah yang diuraikan terjadi. (setelah memutakhirkan jquery), dapat memperbaikinya dengan memiliki url tab seperti ini:

<li><a href="{$smarty.server.REQUEST_URI}#tab_1"></li>

ini membuat mereka "lokal"

referensi yang saya gunakan:

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 /

womd
sumber
2

Bekerja dengan AngularJS tag BASE memecahkan $ cookieStore diam-diam dan butuh beberapa saat untuk mencari tahu mengapa aplikasi saya tidak bisa menulis cookie lagi. Diperingatkan ...

johan
sumber
1

Satu hal yang perlu diingat:

Jika Anda mengembangkan halaman web yang akan ditampilkan dalam UIWebView di iOS, maka Anda harus menggunakan tag BASE. Itu tidak akan berhasil jika tidak. Jadilah itu JavaScript, CSS, gambar - tidak satupun dari mereka akan bekerja dengan tautan relatif di bawah UIWebView, kecuali tag DASAR ditentukan.

Saya sudah ketahuan dengan ini sebelumnya, sampai saya tahu.

vitaly-t
sumber
1

Saya telah menemukan cara untuk menggunakan <base>dan memasang tautan berbasis. Anda dapat menggunakan JavaScript untuk menjaga tautan seperti #contactberfungsi sebagaimana mestinya. Saya menggunakannya di beberapa halaman paralaks dan berfungsi untuk saya.

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

Anda harus menggunakan di akhir halaman

quakeglen
sumber
0

Rekomendasi saya adalah TIDAK untuk menggunakan <base>elemen dalam mengelola jalur url . Mengapa?

Itu hanya memperdagangkan satu masalah dengan yang lain. Tanpa elemen dasar Anda dapat menggunakan sistem jalur apa pun yang Anda suka untuk jalur dan tautan relatif Anda tanpa takut akan putus. Saat Anda mengatur elemen dasar ke jalur Anda "terkunci" untuk merancang semua url Anda untuk bekerja dari jalur itu dan sekarang harus mengubah SEMUA jalur untuk bekerja dari jalur dasar. Ide buruk!

Itu berarti Anda sekarang harus menulis jalur yang LEBIH LAMA DAN melacak di mana setiap jalur relatif terhadap basis ini. Lebih buruk ..... ketika menggunakan <base>elemen yang mereka sarankan Anda menggunakan path dasar yang sepenuhnya memenuhi syarat untuk mendukung browser yang lebih lama (" https://www.example.com/ "), jadi sekarang Anda telah mengkodekan domain Anda ke dalam Anda halaman atau membuat semua tautan Anda bergantung pada jalur domain yang valid.

Di sisi lain, begitu Anda menghapus path dasar lagi dari situs web Anda, Anda sekarang bebas lagi untuk menggunakan path relatif lebih pendek, yang dapat sepenuhnya memenuhi syarat, menggunakan path absolut dari root, atau menggunakan path yang benar-benar relatif terhadap file dan folder Anda. Ini jauh lebih fleksibel. Dan yang terbaik dari semua fragmen seperti "#Hello" bekerja dengan benar tanpa ada perbaikan tambahan. Sekali lagi, orang menciptakan masalah yang tidak ada.

Juga argumen di atas bahwa url penggunaan Anda untuk membantu Anda memigrasi folder halaman web ke lokasi subfolder baru tidak terlalu penting hari ini karena sebagian besar server modern memungkinkan Anda untuk dengan cepat mengatur subfolder sebagai folder root aplikasi baru di bawah domain apa pun. Definisi atau "root" aplikasi web tidak dibatasi oleh folder atau domain sekarang.

Agak konyol seluruh perdebatan ini. Jadi saya katakan tinggalkan url basis dan mendukung sistem jalur default server-client asli yang lebih lama yang tidak menggunakannya.

Catatan: Jika masalah yang Anda miliki adalah mengontrol jalur karena beberapa sistem API baru, solusinya sederhana ... konsistenlah dengan cara Anda merinci semua url dan tautan di API Anda. Jangan mengandalkan dukungan browser dari base atau HTML5 atau trik sirkus yang lebih baru seperti yang dilakukan kiddies API javascript. Cukup path semua tag anchor Anda secara konsisten dan Anda tidak akan pernah memiliki masalah. Terlebih lagi, aplikasi web Anda langsung portabel ke server baru terlepas dari sistem jalur yang digunakan.

Apa yang lama itu baru lagi! Elemen dasarnya jelas tentang mencoba menciptakan solusi untuk masalah yang tidak pernah ada di Dunia Web 20 tahun yang lalu, apalagi saat ini.

Stokely
sumber
-1

Basis contoh href

Ucapkan halaman khas dengan tautan:

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

.dan tautan ke folder berbeda:

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

Dengan base href , kita dapat menghindari mengulangi folder dasar:

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

Jadi itu adalah kemenangan .. namun halaman terlalu sering mengandung url ke basis yang berbeda Dan web saat ini hanya mendukung satu basis href per halaman , jadi kemenangan tersebut dengan cepat hilang sebagai basis yang tidak basis βˆ™ href diulang, misalnya:

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


Kesimpulan

( Target basis mungkin berguna.) Base href tidak berguna karena:

  • halaman sama-sama BASAH karena:
    • basis default [– folder eksternal] β‡Œ sempurna (kecuali pengecualian yang tidak perlu / jarang π’ž1 & π’ž2 ).
    • web saat ini β‡Œ beberapa basis hrefs tidak didukung .

Terkait

Pacerier
sumber
Pasti @ downvoters tidak akan dapat menjelaskan bagaimana basehref berguna, terutama ketika seluruh industri secara luas merekomendasikan untuk tidak menggunakannya.
Pacerier