ค้นหาเว็บไซต์

วิธีการเปลี่ยนเส้นทางภายในด้วย 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 สำหรับรายการแฟล็กการเขียนซ้ำทั้งหมดที่มีอยู่

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