วิธีการเปลี่ยนเส้นทางภายในด้วย mod_rewrite ใน Apache
ในบทความนี้และบทความถัดไป เราจะอธิบายวิธีใช้ mod_rewrite เพื่อแมปคำขอ HTTP บางอย่างกับหน้าอื่น ๆ ในเว็บไซต์ หรือกับ URL ภายนอก
กล่าวอีกนัยหนึ่ง โมดูล Apache ที่รู้จักกันดีนี้จะช่วยให้คุณสามารถเปลี่ยนเส้นทาง URL ไปยัง URL อื่นได้ ซึ่งเราจะอธิบายผ่านตัวอย่างที่เป็นประโยชน์
การอ่านที่แนะนำ: 5 เคล็ดลับในการเพิ่มประสิทธิภาพของเว็บเซิร์ฟเวอร์ Apache ของคุณ
หมายเหตุ: ตัวอย่างด้านล่างนี้ถือว่าอย่างน้อยคุณค่อนข้างคุ้นเคยกับ Perl Compatible Regular Expressions (PCRE) เนื่องจากหัวข้อนั้นอยู่นอกขอบเขตของบทความนี้ โปรดดูเอกสาร Perl 5 เวอร์ชัน 24.0 สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ PCRE
ก่อนดำเนินการต่อ ตรวจสอบให้แน่ใจว่าได้โหลดโมดูลการเขียนซ้ำแล้ว แม้ว่านี่จะเป็นพฤติกรรมเริ่มต้นใน CentOS และการแจกแจงที่คล้ายกัน แต่ใน Debian และอนุพันธ์ คุณจะต้องโหลดด้วยตนเองดังนี้:
a2enmod rewrite
การกำหนดค่า Apache เพื่อใช้โมดูล mod_rewrite
เพื่อความง่าย ลองใช้ไซต์เริ่มต้นในกล่อง CentOS 7 (IP 192.168.0.100) เพื่ออธิบายวิธีใช้ mod_rewrite ( DocumentRoot: /var/www/html ไฟล์การกำหนดค่า: /etc/httpd/conf/httpd.conf)
เพื่อให้ Apache ใช้โมดูลนี้ ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์การกำหนดค่า:
RewriteEngine on
สิ่งสำคัญคือต้องทราบว่าการกำหนดค่านี้จะไม่ได้รับการสืบทอดโดยโฮสต์เสมือนในกล่องเดียวกัน
ดังนั้น คุณจะต้องเพิ่ม RewriteEngine ให้กับโฮสต์เสมือนแต่ละโฮสต์ที่คุณต้องการใช้กฎการเขียนซ้ำ
การเปลี่ยนเส้นทางภายใน: การแมป URL ไปยังอีกโฮสต์หนึ่งเสมือนในโฮสต์เสมือนเดียวกัน
การเปลี่ยนเส้นทางภายในเป็นตัวอย่างที่ง่ายที่สุดของ mod_rewrite หากคุณต้องการเปลี่ยนเส้นทางคำขอทั้งหมดสำหรับ default.aspx ไปที่ index.html ให้เพิ่มบรรทัดต่อไปนี้ (หรือที่เรียกว่ากฎการเขียนซ้ำ) ใต้ RewriteEngine บน:
RewriteRule "^/default\.aspx$" "/index.html"
และอย่าลืมรีสตาร์ท Apache เพื่อให้การเปลี่ยนแปลงมีผล
สิ่งนี้อาจมีประโยชน์หากเว็บไซต์ของคุณได้รับการออกแบบโดยใช้ ASP และต่อมาเปลี่ยนเป็น HTML5 ธรรมดา เครื่องมือค้นหาจะมีการจัดทำดัชนีไฟล์ .aspx
แต่ไฟล์นั้นไม่มีอยู่อีกต่อไป
ในกรณีนั้น คุณจะต้องค้นหาวิธีเปลี่ยนเส้นทางคำขอ เพื่อไม่ให้ผู้เยี่ยมชมของคุณพบกับหน้าแสดงข้อผิดพลาด ในการทดสอบ เรามาสร้างไฟล์ HTML ง่ายๆ ชื่อ index.html
ภายใน /var/www/html โดยมีเนื้อหาดังต่อไปนี้:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>New site</title>
</head>
<body>
<h2>Default.aspx was here, but now it's index.html</h2>
</body>
</html>
เครื่องหมาย คาเร็ต และ ดอลลาร์ จะทำให้นิพจน์ทั่วไปจับคู่สตริงใดๆ ที่ขึ้นต้นด้วย /default
และลงท้ายด้วย .aspx
ตามลำดับ
การอ่านที่แนะนำ: ติดตั้ง Mod_Pagespeed เพื่อเร่งความเร็วประสิทธิภาพของ Apache สูงสุด 10x
ตอนนี้เปิดเบราว์เซอร์ของคุณและชี้ไปที่ 192.168.0.100/default.aspx หากสิ่งต่างๆ เป็นไปตามที่คาดไว้ Apache ควรให้บริการ index.html
แทน
อย่างไรก็ตาม ผู้ใช้จะยังคงเห็น default.aspx
ในแถบที่อยู่ ทำให้การเปลี่ยนแปลงมีความโปร่งใสโดยสิ้นเชิง:
หากคุณต้องการให้ URL ในแถบที่อยู่แสดงว่าเซิร์ฟเวอร์นั้นให้บริการ index.html
จริงๆ แทนที่จะเป็นหน้าที่ชื่อ default.aspx
ให้เพิ่ม [R, L]
ต่อท้ายกฎการเขียนใหม่ดังนี้:
RewriteRule "^/default\.aspx$" "/index.html" [R,L]
[R,L]
ต่อไปนี้เป็นแฟล็กทางเลือกสองแฟล็กที่ระบุว่าควรเปลี่ยนเส้นทาง HTTP ที่สมบูรณ์ไปยังเบราว์เซอร์ (R)
และไม่ควรประมวลผลกฎเพิ่มเติม:
โปรดทราบว่าขณะนี้แถบที่อยู่แสดง index.html
ตามที่คาดไว้ แทนที่จะเป็น default.aspx
เหมือนที่เคยแสดงก่อนหน้านี้
สรุป
ในบทความนี้ เราได้อธิบายวิธีใช้ mod_rewrite เพื่อดำเนินการเปลี่ยนเส้นทางภายใน คอยติดตามโพสต์ถัดไปที่เราจะเรียนรู้วิธีเปลี่ยนเส้นทางไปยังทรัพยากรที่ถูกย้ายไปยังเซิร์ฟเวอร์อื่น และวิธีการแสดงเนื้อหาที่กำหนดเองตามเบราว์เซอร์ของผู้ใช้ ในระหว่างนี้ โปรดดูเอกสาร Apache 2.4 สำหรับรายการแฟล็กการเขียนซ้ำทั้งหมดที่มีอยู่
และเช่นเคย โปรดใช้แบบฟอร์มความคิดเห็นด้านล่างหากคุณมีคำถามหรือข้อเสนอแนะเกี่ยวกับบทความนี้ เราหวังว่าจะได้ยินจากคุณ!