คำแนะนำสำหรับแท็ก html <base> คืออะไร


462

ฉันไม่เคยเห็น<base>แท็ก HTML ใช้จริงมาก่อน มีข้อผิดพลาดในการใช้ซึ่งหมายความว่าฉันควรหลีกเลี่ยง

ความจริงที่ว่าฉันไม่เคยสังเกตเห็นมันถูกใช้ในเว็บไซต์การผลิตที่ทันสมัย ​​(หรือเว็บไซต์ใด ๆ ) ทำให้ฉันรู้สึกสับสนแม้ว่ามันจะดูเหมือนว่ามันอาจมีแอปพลิเคชั่นที่มีประโยชน์สำหรับการทำให้ลิงก์ในเว็บไซต์ของฉันง่ายขึ้น


แก้ไข

หลังจากใช้แท็กฐานเป็นเวลาสองสามสัปดาห์ฉันก็พบว่ามีgotchas สำคัญ ๆด้วยการใช้แท็กฐานที่ทำให้มันเป็นที่ต้องการน้อยกว่าที่มันปรากฏครั้งแรก โดยพื้นฐานแล้วการเปลี่ยนแปลงไปยังhref='#topic'และhref=''ภายใต้แท็กฐานนั้นเข้ากันไม่ได้กับพฤติกรรมเริ่มต้นของพวกเขาและการเปลี่ยนแปลงจากพฤติกรรมเริ่มต้นนี้สามารถทำให้ห้องสมุดบุคคลที่สามอยู่นอกการควบคุมของคุณไม่น่าเชื่อถืออย่างมาก ในรูปแบบที่ไม่คาดคิดเนื่องจากเหตุผลจะขึ้นอยู่กับพฤติกรรมเริ่มต้น บ่อยครั้งที่การเปลี่ยนแปลงนั้นบอบบางและนำไปสู่ปัญหาที่ไม่ชัดเจนในทันทีเมื่อจัดการกับ codebase ขนาดใหญ่ ฉันได้สร้างคำตอบโดยละเอียดตั้งแต่ปัญหาที่ฉันพบด้านล่าง ดังนั้นทดสอบผลลัพธ์ลิงก์ด้วยตัวคุณเองก่อนที่คุณจะยอมรับการปรับใช้อย่างกว้างขวาง<base>นั่นคือคำแนะนำใหม่ของฉัน!


12
มักใช้ในผลลัพธ์ของเครื่องมือค้นหารุ่นแคชเพื่อให้ลิงก์ทำงานได้
Gumbo

11
ที่ควรทราบ: แท็กฐานยังโต้ตอบกับจุดยึดง่ายดังนั้นหากคุณใช้ฐานสิ่งที่ก่อนหน้านี้เป็นเพียงจุดยึดตำแหน่งในหน้า<a href='#anchor1'>Anchor1</a>จะใช้แท็กฐานเช่นกันแทนที่พฤติกรรมเริ่มต้นของการอ้างอิงหน้าปัจจุบันเป็น ฐาน. ดังนั้นจึงเป็นสิ่งที่ต้องระวัง (แม้ว่าอาจจะแก้ไขได้โดยใช้แท็กฐานอื่นในหน้าเว็บที่ใช้จุดยึดจำนวนมาก)
Kzqai

1
หากคุณไม่พอใจกับคำตอบที่ยอมรับได้ทำไมคุณไม่รับและกำหนดใหม่?
Pops

1
ไม่ทราบว่าเป็นตัวเลือก แต่ใช่ไม่ต้องการตัวแทนหญิงโสเภณี (ถ้าให้คะแนนกับฉันด้วย) แต่ฉันคิดว่าในการวิเคราะห์ขั้นสุดท้ายข้อเสียมีมากกว่าข้อดีและต้องการเน้นสิ่งนั้น
Kzqai

2
โดยทั่วไปคุณจะไม่ดูซอร์สโค้ดของทุกไซต์หลักที่คุณไป ฉันเชื่อว่ามีคนใช้งาน<base>มากกว่าที่คุณคิด
Mathias Lykkegaard Lorenzen

คำตอบ:


259

ก่อนที่จะตัดสินใจว่าจะใช้<base>แท็กหรือไม่คุณต้องเข้าใจวิธีการทำงานสิ่งที่สามารถใช้งานได้และสิ่งที่เกี่ยวข้องคืออะไรและในที่สุดก็มีมากกว่าข้อดี / ข้อเสีย


<base>แท็กส่วนใหญ่ eases สร้างการเชื่อมโยงญาติใน templating ภาษาที่คุณไม่จำเป็นต้องกังวลเกี่ยวกับบริบทปัจจุบันในทุกการเชื่อมโยง

คุณสามารถทำเช่น

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

แทน

<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>ค่าลงท้ายด้วยเครื่องหมายสแลชมิฉะนั้นจะถูกตีความเทียบกับเส้นทางสุดท้าย


ความเข้ากันได้ของเบราว์เซอร์ทำให้เกิดปัญหาเฉพาะใน IE <base>แท็กใน HTML ที่ระบุไว้ไม่ได้มีแท็กสิ้นสุดลง</base>ดังนั้นจึงเป็นเรื่องถูกต้องตามกฎหมายที่จะใช้เพียงแค่<base>ไม่มีป้ายสิ้น อย่างไรก็ตาม IE6 คิดเป็นอย่างอื่นและเนื้อหาทั้งหมดหลังจากที่<base>แท็กอยู่ในกรณีเช่นนี้ถูกวางไว้เป็นลูกของ<base>องค์ประกอบในต้นไม้ HTML DOM สิ่งนี้สามารถทำให้เกิดปัญหาตั้งแต่แรกเห็นใน Javascript / jQuery / CSS ซึ่งเป็นองค์ประกอบที่ไม่สามารถเข้าถึงได้อย่างสมบูรณ์ในตัวเลือกเฉพาะเช่นhtml>bodyจนกระทั่งคุณค้นพบในตัวตรวจสอบ HTML DOM ว่าควรมีbase(และhead) อยู่ระหว่างนั้น

การแก้ไข IE6 ทั่วไปใช้ความคิดเห็นแบบมีเงื่อนไขของ IE เพื่อรวมแท็กปิดท้าย:

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

หากคุณไม่สนใจ W3 Validator หรือเมื่อคุณใช้ HTML5 อยู่แล้วคุณก็สามารถปิดได้ด้วยตนเองเว็บเบราเซอร์ทุกเครื่องก็รองรับได้:

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

การปิด<base>แท็กยังแก้ไขความบ้าของ IE6 บน WinXP SP3 ทันทีเพื่อร้องขอ<script>ทรัพยากรด้วย URI ที่เกี่ยวข้องsrcในวงวนไม่สิ้นสุด

อีกปัญหาที่อาจเกิดขึ้น IE จะประจักษ์เมื่อคุณใช้ URI สัมพันธ์ใน<base>แท็กเช่นหรือ<base href="https://stackoverflow.com//example.com/somefolder/"> <base href="https://stackoverflow.com/somefolder/">สิ่งนี้จะล้มเหลวใน IE6 / 7/8 อย่างไรก็ตามนี่ไม่ใช่ความผิดของเบราว์เซอร์ การใช้ URI ที่สัมพันธ์กันใน<base>แท็กนั้นอยู่ที่ผิดของตัวเอง ข้อกำหนด HTML4ระบุว่าควรจะเป็น URI แน่นอนจึงเริ่มต้นด้วยhttp://หรือhttps://โครงการ นี้ได้รับการลดลงในสเปค HTML5 ดังนั้นหากคุณใช้ HTML5 และกำหนดเป้าหมายเฉพาะเบราว์เซอร์ที่รองรับ HTML5 เท่านั้นคุณควรใช้ URI ที่สัมพันธ์กันใน<base>แท็ก


เป็นไปโดยใช้ชื่อ / กัญชาเบรกส่วนชอบ<a href="#anchor">เบรกสตริงแบบสอบถามเหมือน<a href="?foo=bar">และจุดยึดเส้นทางส่วนเช่น<a href=";foo=bar">กับ<base>แท็กคุณพื้นประกาศทั้งหมดเชื่อมโยงญาติญาติให้มันรวมทั้งชนิดของเบรกเหล่านั้น ไม่มีลิงก์ที่เกี่ยวข้องใด ๆ ที่เกี่ยวข้องกับ URI คำขอปัจจุบันอีกต่อไป (ซึ่งจะเกิดขึ้นหากไม่มี<base>แท็ก) นี่อาจเป็นเรื่องที่สับสนสำหรับผู้เริ่มต้น ในการสร้างแองเคอร์เหล่านั้นอย่างถูกวิธีคุณจำเป็นต้องรวม URI ด้วย

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

ซึ่ง${uri}โดยทั่วไปแปลว่า$_SERVER['REQUEST_URI']ใน PHP ${pageContext.request.requestURI}ใน JSP และ#{request.requestURI}ใน JSF ตั้งข้อสังเกตว่าควรจะมีกรอบ MVC เช่น JSF <base>มีแท็กลดทุกต้นแบบนี้และขจัดความจำเป็นในการ ดูเพิ่มเติมอ่าวอะไร URL ไปยังการใช้งานเพื่อการเชื่อมโยง / นำทางไปยังหน้า


BalusC เกี่ยวกับเวลาเดียวกันเมื่อฉันเขียนคำตอบที่นี่stackoverflow.com/a/46539210/632951มีความคิดเห็นที่มีประโยชน์มากกว่า 10+ รายการภายใต้หัวข้อนี้โพสต์โดยผู้เขียนหลายคนในช่วง 8 ปีที่มีรายละเอียดข้อมูลเกี่ยวกับ <base> ความคิดใดที่ลิงค์ความคิดเห็นได้ถูกย้ายไป?
Pacerier

162

รายละเอียดของผลกระทบของแท็กฐาน:

แท็กฐานดูเหมือนจะมีเอฟเฟกต์ที่ไม่ได้ใช้งานง่ายและฉันขอแนะนำให้ตระหนักถึงผลลัพธ์และทดสอบด้วยตัวเองก่อนที่จะพึ่งพา<base>! เนื่องจากฉันได้ค้นพบพวกเขาหลังจากพยายามใช้แท็กฐานเพื่อจัดการไซต์ท้องถิ่นที่มี URL ที่แตกต่างกันและพบว่ามีผลกระทบที่เป็นปัญหาเท่านั้นหลังจากนั้นทำให้ฉันรู้สึกหดหู่ใจ

ฉันจะใช้แท็กฐานของ: <base href="http://www.example.com/other-subdirectory/">เป็นตัวอย่างของฉันในกรณีด้านล่างและจะแสร้งทำเป็นว่าหน้าเว็บที่มีรหัสคือhttp://localsite.com/original-subdirectory

สาขา:

ไม่มีลิงก์หรือชื่อจุดยึดหรือ hrefs ว่างเปล่าจะชี้ไปที่ไดเรกทอรีย่อยดั้งเดิมยกเว้นว่ามีการทำอย่างชัดเจน: แท็กฐานทำให้ลิงก์ทุกอย่างแตกต่างกันรวมถึงลิงค์ยึดหน้าเดียวกันไปยัง URL ของแท็กฐานแทนเช่น:

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

ในการทำงานบางอย่างคุณสามารถแก้ไขปัญหาเหล่านี้ได้ในลิงก์ที่คุณสามารถควบคุมได้โดยระบุว่าลิงก์เหล่านี้เชื่อมโยงไปยังหน้าที่พวกเขาเปิดอยู่ แต่เมื่อคุณเพิ่มไลบรารีบุคคลที่สามลงในมิกซ์ที่ขึ้นอยู่กับพฤติกรรมมาตรฐาน มันสามารถทำให้เกิดความยุ่งเหยิงขนาดใหญ่ได้อย่างง่ายดาย

ผู้เยาว์:

IE6 แก้ไขที่ต้องใช้ความคิดเห็นเงื่อนไข: ต้องความคิดเห็นเงื่อนไขสำหรับ IE6 เพื่อหลีกเลี่ยงการกวดขันขึ้นเป็นลำดับ Dom คือ<base href="http://www.example.com/"><!--[if lte IE 6]></base><![endif]-->เป็นBalusCที่กล่าวถึงในคำตอบของเขาดังกล่าวข้างต้น

โดยรวมแล้วปัญหาที่สำคัญทำให้การใช้งานยุ่งยากหากคุณไม่สามารถควบคุมการแก้ไขทุกลิงก์ได้อย่างสมบูรณ์และอย่างที่ฉันกลัวในตอนแรกมันทำให้เกิดปัญหามากกว่าที่มันคุ้มค่า ตอนนี้ฉันต้องออกไปและเขียนการใช้งานทั้งหมดของฉันใหม่! : p

ลิงค์ที่เกี่ยวข้องของการทดสอบปัญหาเมื่อใช้ "แฟรกเมนต์" / แฮช:

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

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


แก้ไขโดยอิซซี่:สำหรับคุณทุกคนวิ่งเข้ามาในความสับสนเช่นเดียวกับฉันเกี่ยวกับความคิดเห็น:

ฉันเพิ่งทดสอบตัวเองด้วยผลลัพธ์ต่อไปนี้:

  • slash ต่อท้ายหรือไม่สร้างความแตกต่างให้กับตัวอย่างที่ให้ไว้ที่นี่ ( #anchorและ?queryจะถูกผนวกเข้ากับที่ระบุ<BASE>)
  • อย่างไรก็ตามมันสร้างความแตกต่างให้กับลิงก์ที่สัมพันธ์กัน: ตัดเครื่องหมายสแลชต่อท้ายother.htmlและdir/other.htmlจะเริ่มต้นDOCUMENT_ROOTด้วยตัวอย่างที่ให้/other-subdirectoryการปฏิบัติ (อย่างถูกต้อง) เป็นไฟล์และถูกละไว้

ดังนั้นสำหรับลิงก์ที่เกี่ยวข้องให้ใช้BASEงานได้ดีกับเพจที่ถูกย้าย - ในขณะที่จุดยึดและ?queriesจะต้องระบุชื่อไฟล์อย่างชัดเจน (โดยBASEมีเครื่องหมายสแลชต่อท้ายหรือองค์ประกอบสุดท้ายที่ไม่ตรงกับชื่อของไฟล์ที่ใช้)

คิดว่าเป็นการ<BASE>แทนที่URL แบบเต็มเป็นไฟล์เอง ( ไม่ใช่ไดเรกทอรีที่อยู่) และคุณจะได้รับสิ่งที่ถูกต้อง สมมติว่าไฟล์ที่ใช้ในตัวอย่างนี้คือother-subdirectory/test.html(หลังจากย้ายไปยังตำแหน่งใหม่) ข้อมูลจำเพาะที่ถูกต้องควรเป็น:

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

- et voila, ทุกอย่าง#anchorทำงานตามที่คาด: ?query, other.html, very/other.html, /completely/other.html,


27

เดี๋ยวก่อนนะ ฉันไม่คิดว่าแท็กฐานสมควรได้รับชื่อเสียงที่ไม่ดีนี้

สิ่งที่ดีเกี่ยวกับแท็กพื้นฐานคือมันช่วยให้คุณสามารถเขียน URL ที่ซับซ้อนซ้ำได้โดยไม่ต้องยุ่งยาก

นี่คือตัวอย่าง คุณตัดสินใจที่จะย้ายhttp://example.com/product/category/thisproductเพื่อhttp://example.com/product/thisproduct คุณเปลี่ยนไฟล์. htaccess เพื่อเขียน URL แรกเป็น URL ที่สอง

ด้วยการใส่แท็กพื้นฐานคุณจะต้อง. htaccess เขียนซ้ำและทำตามนั้น ไม่มีปัญหา. แต่ไม่มีแท็กฐานลิงก์ที่เกี่ยวข้องทั้งหมดของคุณจะแตก

บ่อยครั้งที่จำเป็นต้องเขียน URL ใหม่เนื่องจากการปรับแต่ง URL เหล่านั้นสามารถช่วยให้สถาปัตยกรรมของเว็บไซต์ของคุณและเครื่องมือค้นหาแสดงผลได้ จริงคุณจะต้องแก้ไขปัญหาสำหรับ "#" และ '' ปัญหาที่คนพูดถึง แต่แท็กฐานสมควรได้รับตำแหน่งในชุดเครื่องมือ


10
จากมุมมองของฉันปัญหาคือการพิสูจน์ในอนาคต หากคุณใช้แท็กฐานในหน้าไลบรารีอื่น ๆ ทั้งหมดที่ทำงานกับหน้านั้นจะได้รับผลกระทบจากแท็กฐานรวมถึงห้องสมุดของบุคคลที่สามที่อาจขึ้นอยู่กับพฤติกรรมเริ่มต้นของแท็ก anchor หรือแฮชเปล่า
Kzqai

4
@Kzqai, +1 จุดดี แต่มีเว็บไซต์จำนวนมากที่ไม่ได้ใช้ห้องสมุดที่มีข้อบกพร่อง ปัญหาไม่ได้อยู่ที่ฐาน hrefแต่เป็นปัญหากับไลบรารีและต้องแก้ไขที่นั่น
Pacerier

2
@Pierier ฉันจะบอกว่าปัญหาแน่นอนอยู่กับฐาน href หรือค่อนข้างปัญหาคือเบราว์เซอร์ดูเหมือนจะไม่ฉลาดพอที่จะไม่ส่งผลกระทบต่อ anchor href ซึ่งเริ่มต้นด้วย # ฉันพยายามแก้ไขด้วย javascript และทำให้เกิดปัญหากับห้องสมุดที่ใช้href='#'ลิงค์ (bootstrap เป็นต้น) การตำหนิห้องสมุดเหมือนกับการตำหนิพวกเขาสำหรับทุกสิ่งที่ผิดพลาดกับ HTML มันเป็นเครื่องมือที่ล้าสมัยสำหรับงานที่ทันสมัยง่ายเหมือน
Deji

2
"ทำการเขียน URL ที่ซับซ้อนด้วยความยุ่งยากน้อยลง" - แม้ว่าในกรณีนี้baseแท็กอาจเป็นวิธีแก้ปัญหาสำหรับการไม่มี (อย่างถูกต้อง) ใช้ URL ที่สัมพันธ์กับรูท (หรือแม้แต่ URL ที่แน่นอน) ในตอนแรก
MrWhite

@Deji เมื่อฉันเขียน "ปัญหา" ฉันหมายถึง "ข้อบกพร่อง" ใช่การมีอยู่จริงของ href ฐานนั้นแท้จริงแล้วคือ "ปัญหา" จริง ๆ แต่ในกรณีข้างต้นฉันกำลังพูดว่าข้อผิดพลาดนั้นไม่ได้มาจาก href ฐาน (แต่อย่าคิดว่าฉันสนับสนุนโดยใช้ฐาน href แน่นอนว่าขาตั้งของฉันคือฐาน href ในรุ่นปัจจุบันไม่มีประโยชน์ : stackoverflow.com/a/46539210/632951วิธีที่ดีที่สุดในตอนนี้คือเลิกใช้หรือเปิดใช้งานหลายอย่าง ฐาน hrefsเนื่องจากจะมีประโยชน์ก็ต่อเมื่อสามารถใช้หลายรายการได้)
Pacerier

22

ในการตัดสินใจว่าควรจะใช้หรือไม่คุณควรระวังสิ่งที่ทำและจำเป็นต้องใช้หรือไม่ นี่เป็นส่วนหนึ่งที่ระบุไว้แล้วคำตอบนี้ซึ่งฉันมีส่วนด้วย แต่เพื่อให้ง่ายต่อการเข้าใจและปฏิบัติตามคำอธิบายที่สองที่นี่ ก่อนอื่นเราต้องเข้าใจ:

ลิงก์ประมวลผลโดยเบราว์เซอร์โดยไม่<BASE>ใช้งานอย่างไร

สำหรับตัวอย่างสมมติว่าเรามี URL เหล่านี้:

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

A + B ทั้งผลในแฟ้มเดียวกันมาก ( index.html) ถูกส่งไปยังเบราว์เซอร์, C แน่นอนส่งpage.html, D /subdir/page.htmlและส่ง

สมมติว่าทั้งสองหน้ามีชุดของลิงก์:

1) ลิงก์แบบเต็มที่ผ่านการรับรองแบบเต็ม ( http://www...)
2) ลิงก์แบบสัมบูรณ์แบบโลคัล ( /some/dir/page.html)
3) ลิงก์แบบสัมพันธ์รวมถึงชื่อไฟล์ ( dir/page.html) และ
4) ลิงก์แบบสัมพันธ์ด้วย "เซ็กเมนต์" เท่านั้น ( #anchor,?foo=bar )

เบราว์เซอร์ได้รับหน้าและแสดงผล HTML หากพบ URL บางรายการจำเป็นต้องทราบว่าจะให้ชี้ไปที่ใด สิ่งนี้ชัดเจนสำหรับลิงก์ 1) ซึ่งเป็นไปตามที่เป็น อื่น ๆ ทั้งหมดขึ้นอยู่กับ URL ของหน้าที่แสดงผล:

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

ตอนนี้มี การเปลี่ยนแปลงอะไรกับ<BASE>การใช้งาน?

<BASE>ควรจะเปลี่ยน URL ไปตามที่ปรากฏเบราว์เซอร์ ดังนั้นจึงทำให้การเชื่อมโยงทั้งหมดเช่นถ้าผู้ใช้เรียกค่า URL <BASE>ที่ระบุไว้ใน ซึ่งอธิบายถึงความสับสนในคำตอบอื่น ๆ :

  • อีกครั้งไม่มีอะไรเปลี่ยนแปลงสำหรับ "ลิงก์แบบเต็มที่ผ่านการรับรองแบบเต็ม" ("ประเภท 1")
  • สำหรับลิงก์แบบสัมบูรณ์ท้องถิ่นเซิร์ฟเวอร์เป้าหมายอาจเปลี่ยนแปลง (ถ้ามีการระบุไว้ในที่<BASE>แตกต่างจากเซิร์ฟเวอร์ที่ถูกเรียกเริ่มต้นจากผู้ใช้)
  • URL สัมพัทธ์กลายเป็นสิ่งสำคัญที่นี่ดังนั้นคุณจะต้องระมัดระวังเป็นพิเศษในการตั้งค่า<BASE>:
    • หลีกเลี่ยงดีกว่าการตั้งค่าไปยังไดเรกทอรี การทำเช่นนั้นลิงก์ของ "ประเภท 3" อาจยังคงใช้งานได้ แต่ส่วนใหญ่จะแบ่งประเภท "ประเภท 4" (ยกเว้น "กรณี B")
    • ตั้งค่าเป็นชื่อไฟล์ที่ผ่านการรับรองโดยสมบูรณ์ซึ่งส่วนใหญ่แล้วผลลัพธ์ที่ต้องการ

ตัวอย่างอธิบายได้ดีที่สุด

สมมติว่าคุณต้องการ "ทำให้ชัดเจน" URL บางส่วนโดยใช้mod_rewrite:

  • ไฟล์จริง: <DOCUMENT_ROOT>/some/dir/file.php?lang=en
  • URL จริง: http://www.example.com/some/dir/file.php?lang=en
  • URL ที่ใช้งานง่าย: http://www.example.com/en/file

สมมติว่าmod_rewriteจะใช้ในการโปร่งใสเขียน URL ที่ใช้งานง่ายเพื่อตัวจริง (ไม่ภายนอกใหม่โดยตรงดังนั้น "ใช้ง่าย" หนึ่งในการเข้าพักในแถบที่อยู่เบราว์เซอร์ในขณะที่จริงใครจะโหลด) ต้องทำอะไรตอนนี้

  • ไม่ได้<BASE>ระบุ: แบ่งลิงก์ที่เกี่ยวข้องทั้งหมด (เนื่องจากจะขึ้นอยู่กับhttp://www.example.com/en/fileตอนนี้)
  • <BASE HREF='http://www.example.com/some/dir>: ผิดอย่างแน่นอน dirจะถือว่าเป็นไฟล์ส่วนของ URL ที่ระบุดังนั้นลิงก์ที่เกี่ยวข้องทั้งหมดจึงไม่สามารถใช้งานได้
  • <BASE HREF='http://www.example.com/some/dir/>ดีกว่าอยู่แล้ว แต่ลิงก์สัมพัทธ์ของ "ประเภท 4" ยังคงใช้งานไม่ได้ (ยกเว้น "กรณี B")
  • <BASE HREF='http://www.example.com/some/dir/file.php>: แน่นอน ทุกอย่างควรทำงานกับอันนี้

บันทึกล่าสุด

โปรดทราบว่าสิ่งนี้ใช้กับURL ทั้งหมดในเอกสารของคุณ:

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

หมายถึงบันทึกย่อสุดท้ายของคุณ ... ฉันอยากรู้อยากเห็น .. มันจะเปลี่ยนวิธีการตีความคำขอ jQuery ajax หรือไม่ สิ่งนี้แตกต่างจาก<SCRIPT SRC=
bkwdesign

@bdddesign ฉันไม่ได้ใช้ jQuery แต่ฉันคิดเอาเอง
Izzy

@Izzy, Re "example" จริงๆแล้วถ้าคุณใส่ </some/dir/file.php?lang=th> ไปยัง </ en / file> คุณจะต้องการ prettify </ some / dir / page2? lang = en> และ </ some / dir / script> ถึง </ en / page2> และ </ en / script> ดังนั้นทางญาติของคุณจะทำงานเช่นเดียวกับที่พวกเขาควรจะ
Pacerier

จะ<BASE HREF='http://www.example.com/some/dir/file.php>ทำงานกับ "ประเภท 4" ได้อย่างไร จะไม่เป็นเช่น " example.com/some/dir/file.php?foo=bar " แทนที่จะเป็นexample.com/subdir/page.html?foo=bar
ANewGuyInTown

@ANewGuyInTown ใช่และนั่นคือสิ่งที่ควรทำ - ในตัวอย่างของฉันhttp://www.example.com/some/dir/file.phpคือ "ตำแหน่งจริง" (ดู "ตัวอย่างอธิบายได้ดีที่สุด") และส่งผ่านเพียงส่วนเดียว ( #anchor) เท่านั้นที่สามารถแก้ไขได้ที่นั่น
Izzy

12

ตอนแรก Drupal พึ่งพา<base>แท็กและหลังจากนั้นจึงตัดสินใจไม่ใช้เนื่องจากปัญหากับโปรแกรมรวบรวมข้อมูล HTTP และแคช

โดยทั่วไปฉันไม่ชอบโพสต์ลิงก์ แต่อันนี้คุ้มค่าการแบ่งปันจริง ๆ เพราะจะเป็นประโยชน์ต่อผู้ที่มองหารายละเอียดของประสบการณ์การใช้งานจริงด้วย<base>แท็ก:

http://drupal.org/node/13148


ลิงก์ชี้ไปที่การสนทนามีแปดปีก่อนคำตอบนี้ดังนั้นเกือบทศวรรษที่ผ่านมา ฉันคิดว่าควรมีการทดสอบอีกเล็กน้อยที่จะต้องทำหากยังคงมีปัญหามากกว่าที่จะเชื่อมโยงไปยังคำอธิบายอายุเก่าแก่ของปัญหาที่อาจไม่มีอยู่
Sami Kuhmonen

จริง แต่ IMHO ก็ยังคงเปิดตาเป็นสิ่งที่ปัญหาที่คุณจำเป็นต้องทดสอบของ<base>การดำเนินงานตามต่อต้านไม่ใช่แค่ว่าเบรกของคุณทำงานขวาในเบราว์เซอร์ของคุณ
Amr Mostafa

@AmrMostafa เพียงไม่ใช้ฐาน href
Pacerier

10

ทำให้หน้าเว็บง่ายขึ้นสำหรับการดูแบบออฟไลน์ คุณสามารถใส่ URL แบบเต็มในแท็กฐานจากนั้นทรัพยากรระยะไกลของคุณจะโหลดอย่างถูกต้อง


@Erik นอกเหนือจากการดูแบบออฟไลน์แล้วก็ใช้งานได้ดีกับทุกขั้นตอนการหยุดชั่วคราวที่จำเป็นต้องสาธิตหน้าของโดเมนในโดเมนอื่น เช่นเมื่อสาธิตหน้ากับ jsfiddle คุณสามารถใช้ base href เพื่อยึดโดเมนของคุณแทนโดเมนของ jsfiddle ¶แม้ว่าการพูดอย่างแนบเนียนการสร้างแท็กสำหรับการใช้ช่องว่างแบบชั่วคราวนั้นไม่ใช่การออกแบบที่ดีดังนั้น href ฐานควรเลิกใช้แล้วและนำออกแม้ในขณะที่สามารถเป็นประโยชน์สำหรับการใช้ช่องว่างแบบชั่วคราว
Pacerier

5

ขณะนี้แฮช "#" ใช้งานได้กับลิงก์ข้ามร่วมกับองค์ประกอบพื้นฐาน แต่เฉพาะใน Google Chrome และ Firefox เวอร์ชันล่าสุดไม่ใช่ IE9

ดูเหมือนว่า IE9 จะทำให้หน้าโหลดซ้ำโดยไม่กระโดดไปไหนเลย หากคุณกำลังใช้ลิงค์กระโดดที่อยู่ด้านนอกของ iframe ในขณะที่กำกับเฟรมเพื่อโหลดลิงค์กระโดดในหน้าแยกต่างหากภายในเฟรมคุณจะได้รับสำเนาลิงค์กระโดดที่อยู่ภายในเฟรมแทน


5

มันอาจไม่ได้รับความนิยมมากเพราะมันไม่เป็นที่รู้จัก ฉันไม่กลัวที่จะใช้มันเนื่องจากเบราว์เซอร์หลัก ๆ ทุกตัวรองรับ

หากเว็บไซต์ของคุณใช้ AJAX คุณจะต้องแน่ใจว่าหน้าทั้งหมดของคุณตั้งค่าไว้อย่างถูกต้องหรือคุณอาจจบด้วยลิงก์ที่ไม่สามารถแก้ไขได้

อย่าใช้แอtargetททริบิวในหน้า HTML 4.01 Strict


กลุ่มเป้าหมายจริง ๆ แล้วมีประโยชน์ แต่ basehref ไม่ใช่ แท้จริงมันไม่ใช่ที่นิยมเพราะไม่ใช่ประโยชน์ ดูคำตอบของฉัน
Pacerier

ขณะนี้เบราว์เซอร์ทั้งหมดรองรับbaseแท็ก
Vitaly Zdanevich

3

ในกรณีของภาพ SVG ที่อยู่ในหน้ามีปัญหาสำคัญอีกประการหนึ่งที่เกิดขึ้นเมื่อใช้baseแท็ก:

เนื่องจากมีbaseแท็ก (ดังที่ระบุไว้ข้างต้นแล้ว) คุณจึงไม่สามารถใช้แฮช URL ที่เกี่ยวข้องเช่น

<a href="#foo">

เพราะพวกเขาจะได้รับการแก้ไขกับ URL ฐานมากกว่าที่ตั้งของเอกสารปัจจุบันจึงไม่ได้เกี่ยวข้องกันอีกต่อไป ดังนั้นคุณจะต้องเพิ่มเส้นทางของเอกสารปัจจุบันไปยังลิงก์ประเภทนี้เช่นสิ่งต่อไปนี้

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

ดังนั้นหนึ่งในแง่บวกที่ดูเหมือนจะเป็นของ baseแท็ก (ซึ่งคือการย้ายส่วนนำหน้า URL ที่ยาวออกไปจากแท็กจุดยึดและรับ nicer, anchors ที่สั้นลง) จะย้อนกลับมาสมบูรณ์สำหรับ URL แฮชของโลคัล

สิ่งนี้น่ารำคาญเป็นอย่างยิ่งเมื่อทำการฝัง SVG ในหน้าของคุณไม่ว่าจะเป็น SVG แบบคงที่หรือ SVG ที่สร้างขึ้นแบบไดนามิกเพราะในSVG อาจมีการอ้างอิงจำนวนมากและพวกเขาทั้งหมดจะพังทันทีที่มีการใช้baseแท็ก การติดตั้งระบบตัวแทน (Chrome ยังคงใช้งานได้อย่างน้อยในสถานการณ์เหล่านี้ ณ เวลาที่เขียน)

หากคุณกำลังใช้ระบบ templating หรือเครื่องมืออื่น ๆ ที่ประมวลผล / สร้างหน้าเว็บของคุณฉันจะพยายามกำจัดbaseแท็กเสมอเพราะเมื่อฉันเห็นมันจะทำให้เกิดปัญหามากขึ้นในตารางมากกว่าที่จะแก้ไขได้


มีหรือไม่มี SVG, แท็กฐานไร้ประโยชน์และถือว่าเป็นอันตราย ดูรายละเอียดเพิ่มเติมของฉัน: stackoverflow.com/a/46539210/632951
Pacerier

3

นอกจากนี้คุณควรจำไว้ว่าหากคุณใช้งานเว็บเซิร์ฟเวอร์ที่พอร์ตที่ไม่ได้มาตรฐานคุณจะต้องรวมหมายเลขพอร์ตที่ base href ด้วย:

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

2

ฉันไม่เคยเห็นจุดใช้งาน ให้ประโยชน์น้อยมากและอาจทำให้สิ่งที่ใช้ยากขึ้น

เว้นแต่คุณจะมีลิงค์เป็นร้อยหรือพันลิงค์ทั้งหมดไปยังไดเรกทอรีย่อยเดียวกัน จากนั้นอาจช่วยประหยัดแบนด์วิดท์สองสามไบต์

หลังจากนั้นฉันดูเหมือนจะจำได้ว่ามีปัญหาบางอย่างกับแท็กใน IE6 คุณสามารถวางไว้ที่ใดก็ได้ในร่างกายโดยเปลี่ยนเส้นทางส่วนต่าง ๆ ของไซต์ไปยังตำแหน่งอื่น สิ่งนี้ได้รับการแก้ไขใน IE7 ซึ่งทำลายไซต์จำนวนมาก


3
ข้อดีอาจไม่ได้ประหยัดแบนด์วิดท์ แต่สะอาดกว่าและมี URL ที่สั้นกว่า น่าเสียดายที่การเปลี่ยนแปลงเล็กน้อยในพฤติกรรมของลิงก์ทั้งหมดนั้นไม่คุ้มค่าจริงๆ
Kzqai

1
baseแท็กเป็นวิธีการแก้ปัญหาบางอย่าง หากคุณไม่มีปัญหาอย่าใช้baseแท็ก ตัวอย่าง: 1. การนำเนื้อหา HTML มาใช้ในระบบที่แตกต่างกัน ลิงค์จะถูกเก็บไว้ในเนื้อหาและมีการbaseตั้งค่าแท็กที่เหมาะสม(โดย CMS) เพื่อให้ลิงก์แก้ไขได้อย่างถูกต้อง 2. ไซต์ที่มีอยู่ใช้ URL สัมพัทธ์ แต่ภายหลังตัดสินใจใช้ URL "สวย" ซึ่งเปลี่ยนความลึกของเส้นทาง URL baseแท็กสามารถมองเห็นเป็นที่นิยมในการ "แก้ไข" ทั้งหมด URL สัมพัทธ์
MrWhite

@MrWhite, CMS ไม่จำเป็นต้องใช้แท็กฐานในการเชื่อมโยงการแก้ปัญหาได้อย่างถูกต้องเป็น HTML แล้วสนับสนุนทางญาติซึ่งเป็นค่าเริ่มต้นไปยังโฟลเดอร์ปัจจุบัน ดูรายละเอียดเพิ่มเติมได้ที่นี่: stackoverflow.com/a/46539210/632951
Pacerier

1
@Pierier ขึ้นอยู่กับว่าเนื้อหาอยู่ที่ไหน (FWIW ฉันไม่ได้อ้างถึง WordPress และคณะ)
MrWhite

@MrWhite โดยทั่วไป CMS จะไม่ใช้ลิงก์แบบคงที่ในตอนแรกดังนั้นตัวอย่างนั้นเป็นประเภทที่แปลก ในความเป็นจริงเว็บไซต์น้อยมากวันนี้สร้างขึ้นโดยใช้ HTML คงที่ - ฉันเห็นคะแนนของคุณที่นั่น แต่นั่นเป็นวิธีแก้ปัญหาที่ล้าสมัยไปแล้วในตอนนี้ (ทุกคนและปู่ย่าตายายของพวกเขากำลังใช้ WordPress หรือคล้ายกันสำหรับทุกอย่าง)
Atli

2

มีไซต์ที่ใช้แท็กฐานและปัญหาที่อธิบายเกิดขึ้น (หลังจากอัปเกรด jquery) ก็สามารถแก้ไขได้โดยมี URL แท็บดังนี้:

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

ทำให้พวกเขา "ท้องถิ่น"

การอ้างอิงที่ฉันใช้:

http://bugs.jqueryui.com/ticket/7822 http://htmlhelp.com/reference/html40/head/base.html http://tjvantoll.com/2013/02/17/using-jquery-ui- แท็บกับที่ฐานแท็ก /


2

การทำงานกับ AngularJS แท็ก BASE ทำลาย $ cookieStore อย่างเงียบ ๆ และใช้เวลาพอสมควรที่จะทราบว่าเหตุใดแอพของฉันจึงไม่สามารถเขียนคุกกี้ได้อีก ถูกเตือน ...


1

สิ่งหนึ่งที่ต้องจำไว้:

หากคุณพัฒนาเว็บเพจที่จะแสดงภายใน UIWebView บน iOS คุณต้องใช้แท็ก BASE มันจะไม่ทำงานอย่างอื่น ไม่ว่าจะเป็น JavaScript, CSS, รูปภาพ - จะไม่มีการทำงานใด ๆ กับลิงก์ที่เกี่ยวข้องภายใต้ UIWebView ยกเว้นว่าจะระบุแท็ก BASE

ฉันเคยถูกจับมาก่อนจนกระทั่งพบ


1

ฉันได้พบวิธีใช้<base>และยึดลิงก์ตาม คุณสามารถใช้ JavaScript เพื่อให้ลิงก์#contactทำงานได้เหมือนที่เคยมีมา ฉันใช้มันในบางหน้าพารัลแลกซ์และใช้ได้กับฉัน

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

คุณควรใช้ที่ส่วนท้ายของหน้า


0

แนะนำของฉันคือไม่ใช้<base>องค์ประกอบในการจัดการเส้นทาง URL ทำไม?

เป็นเพียงการแลกเปลี่ยนปัญหาหนึ่งสำหรับอีก หากไม่มีองค์ประกอบพื้นฐานคุณสามารถใช้ระบบเส้นทางใดก็ได้ที่คุณต้องการสำหรับเส้นทางและลิงก์ที่เกี่ยวข้องโดยไม่ต้องกลัวว่ามันจะแตก นาทีที่คุณตั้งค่าองค์ประกอบพื้นฐานเป็นพา ธ ที่คุณ "ล็อคใน" เพื่อออกแบบ URL ทั้งหมดของคุณให้ทำงานนอกเส้นทางนั้นและตอนนี้จะต้องเปลี่ยนเส้นทางทั้งหมดให้ทำงานจากเส้นทางพื้นฐาน ความคิดที่ไม่ดี!

นั่นหมายความว่าคุณต้องเขียนเส้นทาง LONGER และติดตามว่าแต่ละเส้นทางสัมพันธ์กับฐานนี้อย่างไร แย่ลง ..... เมื่อใช้<base>องค์ประกอบที่พวกเขาแนะนำให้คุณใช้เส้นทางฐานที่มีคุณสมบัติครบถ้วนเพื่อสนับสนุนเบราว์เซอร์รุ่นเก่า (" https://www.example.com/ ") ดังนั้นตอนนี้คุณได้เข้ารหัสโดเมนของคุณลงใน หน้าหรือทำให้ลิงค์ทั้งหมดของคุณขึ้นอยู่กับเส้นทางของโดเมนที่ถูกต้อง

ในทางกลับกันนาทีที่คุณลบพา ธ ฐานออกจากเว็บไซต์ของคุณอีกครั้งตอนนี้คุณว่างอีกครั้งเพื่อใช้พา ธ สัมพัทธ์ที่สั้นลงซึ่งสามารถผ่านการรับรองโดยสมบูรณ์ใช้เส้นทางสัมบูรณ์จากรูทหรือใช้เส้นทางที่สัมพันธ์กับ ไฟล์และโฟลเดอร์ที่คุณมีความยืดหยุ่นมากขึ้น และดีที่สุดของชิ้นส่วนทั้งหมดเช่น "#hello" ทำงานอย่างถูกต้องโดยไม่มีการแก้ไขเพิ่มเติมใด ๆ อีกครั้งที่ผู้คนกำลังสร้างปัญหาที่ไม่มีอยู่

นอกจากนี้อาร์กิวเมนต์ข้างต้นที่คุณใช้ url พื้นฐานเพื่อช่วยให้คุณย้ายโฟลเดอร์ของหน้าเว็บไปยังตำแหน่งโฟลเดอร์ย่อยใหม่ไม่ได้มีความสำคัญในปัจจุบันเนื่องจากเซิร์ฟเวอร์ที่ทันสมัยส่วนใหญ่อนุญาตให้คุณตั้งค่าโฟลเดอร์ย่อยใด ๆ เป็นโฟลเดอร์รูทของแอปพลิเคชันใหม่ คำจำกัดความหรือ "รูท" ของเว็บแอปพลิเคชันไม่ได้ถูก จำกัด โดยโฟลเดอร์หรือโดเมนอย่างใดอย่างหนึ่งในขณะนี้

ดูเหมือนว่าจะเป็นเรื่องโง่ ๆ ดังนั้นฉันจึงพูดว่าไม่ต้องระบุ URL พื้นฐานและสนับสนุนระบบพา ธ เริ่มต้นของเซิร์ฟเวอร์ลูกข่ายดั้งเดิมที่ไม่ได้ใช้

หมายเหตุ: หากปัญหาที่คุณมีคือการควบคุมเส้นทางเนื่องจากระบบ API ใหม่บางวิธีการแก้ปัญหานั้นง่าย ... ให้สอดคล้องในวิธีที่คุณกำหนดเส้นทาง URL และลิงก์ทั้งหมดใน API ของคุณ อย่าพึ่งพาการสนับสนุนเบราว์เซอร์ของฐานหรือ HTML5 หรือลูกเล่นละครสัตว์ที่ใหม่กว่าอย่าง javascript API kiddies เพียงกำหนดเส้นทางแท็กสมอทั้งหมดของคุณอย่างสม่ำเสมอและคุณจะไม่มีปัญหา ยิ่งไปกว่านั้นเว็บแอปพลิเคชันของคุณสามารถพกพาไปยังเซิร์ฟเวอร์ใหม่ได้ทันทีโดยไม่คำนึงถึงระบบเส้นทางที่ใช้

มีอะไรใหม่อีกแล้ว! องค์ประกอบพื้นฐานชัดเจนเกี่ยวกับการพยายามสร้างวิธีการแก้ปัญหาที่ไม่เคยมีอยู่ในเว็บโลกเมื่อ 20 ปีที่แล้วซึ่งน้อยกว่ามากในปัจจุบัน


-1

ตัวอย่าง href ฐาน

พูดถึงหน้าทั่วไปด้วยลิงก์:

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

. และลิงก์ไปยังโฟลเดอร์ diff:

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

ด้วยbase hrefเราสามารถหลีกเลี่ยงการทำซ้ำโฟลเดอร์ฐาน:

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

ดังนั้นนั่นคือการชนะ .. แต่หน้าบ่อยเกินไปประกอบด้วย URL ที่จะกระจายฐานและเว็บปัจจุบันสนับสนุนเพียงหนึ่งฐาน href ต่อหน้าดังนั้นการชนะจะหายไปอย่างรวดเร็วเนื่องจากฐานที่ไม่ซ้ำฐานเช่น:

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


ข้อสรุป

( เป้าหมายพื้นฐานอาจมีประโยชน์) Base href ไร้ประโยชน์เช่น:

  • หน้าเท่ากันเปียกตั้งแต่:
    • ฐานเริ่มต้น [– – โฟลเดอร์ธรรมดา] ⇌สมบูรณ์แบบ (ยกเว้นข้อยกเว้นที่ไม่จำเป็น / หายาก𝒞1 & 𝒞2 )
    • เว็บปัจจุบัน⇌ ฐานหลาย HREF ของได้รับการสนับสนุน

ที่เกี่ยวข้อง


มี @downvoters บางตัวที่ไม่สามารถอธิบายได้ว่า basehref มีประโยชน์อย่างไรโดยเฉพาะอย่างยิ่งเมื่ออุตสาหกรรมทั้งหมดแนะนำให้ใช้อย่างกว้างขวาง
Pacerier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.