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!
sumber
<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).<base>
daripada yang Anda pikirkan.Jawaban:
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
dari pada
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 sepertihtml>body
, sampai Anda menemukan di inspektur HTML DOM bahwa harus adabase
(danhead
) di antaranya.Perbaikan IE6 yang umum adalah menggunakan komentar bersyarat IE untuk menyertakan tag akhir:
Jika Anda tidak peduli dengan W3 Validator, atau ketika Anda sudah menggunakan HTML5, maka Anda bisa menutup sendiri, setiap webbrowser mendukungnya:
Menutup
<base>
tag juga secara instan memperbaiki kegilaan IE6 pada WinXP SP3 untuk meminta<script>
sumber daya dengan URI relatif disrc
dalam 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 denganhttp://
atauhttps://
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,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 .sumber
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-subdirectoryUtama:
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 yangBalusC
disebutkan 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:
#anchor
dan?query
hanya akan ditambahkan ke yang ditentukan<BASE>
).other.html
dandir/other.html
akan mulaiDOCUMENT_ROOT
dengan contoh yang diberikan,/other-subdirectory
diperlakukan (dengan benar) sebagai file dan dengan demikian dihilangkan.Jadi untuk tautan relatif,
BASE
berfungsi baik dengan halaman yang dipindahkan - sementara jangkar dan?queries
perlu nama file ditentukan secara eksplisit (denganBASE
memiliki 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 adalahother-subdirectory/test.html
(setelah dipindahkan ke lokasi baru), spesifikasi yang benar seharusnya:- et voila, semuanya bekerja seperti yang diharapkan:
#anchor
,?query
,other.html
,very/other.html
,/completely/other.html
.sumber
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.
sumber
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.base
tag ini bisa dibilang solusi untuk tidak (benar) menggunakan URL relatif-root (atau bahkan URL mutlak) di tempat pertama.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 mengirimpage.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
), dan4) 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:
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:<BASE>
berbeda dari yang dipanggil awalnya dari pengguna)<BASE>
:Contoh menjelaskan itu yang terbaik
Katakanlah Anda ingin "mempoles" beberapa URL menggunakan
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
Mari kita asumsikan
mod_rewrite
digunakan 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?<BASE>
ditentukan: mematahkan semua tautan relatif (karena akan didasarkan padahttp://www.example.com/en/file
sekarang)<BASE HREF='http://www.example.com/some/dir>
: Benar-benar salah.dir
akan 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=
sumber
<SCRIPT SRC=
<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=barhttp://www.example.com/some/dir/file.php
adalah "lokasi nyata" (lihat "contoh menjelaskannya dengan terbaik"), dan hanya melewati satu fragmen (#anchor
) hanya dapat diselesaikan di sana.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
sumber
<base>
implementasi berbasis Anda terhadap, bukan hanya bahwa jangkar Anda bekerja tepat di browser Anda.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.
sumber
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.
sumber
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
target
atribut di halaman Ketat HTML 4.01.sumber
base
tag.Dalam kasus gambar SVG yang digariskan di halaman ada masalah penting lain yang muncul ketika
base
tag digunakan:Karena dengan
base
tag (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
base
tag (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
base
tag 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
base
tag, karena seperti yang saya lihat, itu membawa lebih banyak masalah ke tabel daripada memecahkannya.sumber
Juga, Anda harus ingat bahwa jika Anda menjalankan server web Anda pada port non-standar, Anda juga perlu memasukkan nomor port pada base href:
sumber
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.
sumber
base
tag adalah solusi untuk beberapa masalah. Jika Anda tidak memiliki masalah maka jangan gunakanbase
tag. Contoh: 1. Menggunakan kembali konten HTML dalam sistem yang berbeda. Tautan disimpan relatif dalam konten danbase
tag 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. Sebuahbase
tag dapat dilihat sebagai lebih baik untuk "memperbaiki" semua URL relatif.punya juga situs tempat tag - dasar digunakan, dan masalah yang diuraikan terjadi. (setelah memutakhirkan jquery), dapat memperbaikinya dengan memiliki url tab seperti ini:
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 /
sumber
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 ...
sumber
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.
sumber
Saya telah menemukan cara untuk menggunakan
<base>
dan memasang tautan berbasis. Anda dapat menggunakan JavaScript untuk menjaga tautan seperti#contact
berfungsi sebagaimana mestinya. Saya menggunakannya di beberapa halaman paralaks dan berfungsi untuk saya.Anda harus menggunakan di akhir halaman
sumber
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.
sumber
Basis contoh href
Ucapkan halaman khas dengan tautan:
.dan tautan ke folder berbeda:
Dengan base href , kita dapat menghindari mengulangi folder dasar:
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:
Kesimpulan
( Target basis mungkin berguna.) Base href tidak berguna karena:
Terkait
sumber