วิธีการใช้ mod_rewrite อย่างมีประสิทธิภาพเพื่อโหลดไฟล์ที่อยู่เบื้องหลัง DocumentRoot ใน Apache

เมื่อทำงานกับเซิร์ฟเวอร์เว็บ Apache คุณอาจจะเจอสถานการณ์ที่ต้องให้บริการไฟล์ที่อยู่ภายนอกไดเรกทอรี DocumentRoot สิ่งนี้อาจจะยุ่งยากและอาจนำไปสู่ข้อผิดพลาดที่น่าผิดหวัง เช่น “ไม่พบ URL ที่ร้องขอบนเซิร์ฟเวอร์นี้” ในบล็อกโพสต์นี้เราจะสำรวจวิธีการตั้งค่าไฟล์ .htaccess และ mod_rewrite เพื่อโหลดไฟล์ที่อยู่เบื้องหลัง DocumentRoot อย่างถูกต้อง

ทำความเข้าใจกับปัญหา

ลองพิจารณาโครงสร้างโฟลเดอร์ดังต่อไปนี้:

home/
    webroot/
    other_files/

สมมุติว่าคุณมีไฟล์ .htaccess ในไดเรกทอรี webroot ที่บรรจุด้วยโค้ดนี้:

RewriteEngine on
RewriteRule ^(.*)$ /home/other_files/$1

หากคุณพยายามเข้าถึง http://example.com/file.html คุณอาจเห็นข้อผิดพลาดเช่น:

ไม่พบ URL ที่ร้องขอ /home/other_files/file.html บนเซิร์ฟเวอร์นี้

ข้อผิดพลาดนี้แสดงว่า Apache ไม่รู้ว่าจะให้บริการไฟล์ที่ตั้งอยู่ในโฟลเดอร์ other_files ได้อย่างไร เนื่องจากอยู่ภายนอก DocumentRoot ที่กำหนด

วิธีแก้ปัญหา

เพื่อโหลดไฟล์ที่อยู่เบื้องหลัง DocumentRoot อย่างถูกต้องโดยใช้ .htaccess และ mod_rewrite คุณจะต้องทำการเปลี่ยนแปลงการตั้งค่าเซิร์ฟเวอร์บางอย่าง ลองแยกขั้นตอนนี้ออกเป็นขั้นตอนที่ชัดเจน

ขั้นตอนที่ 1: กำหนดค่าเซิร์ฟเวอร์ Apache

เพื่ออนุญาตให้ Apache ให้บริการไฟล์จากไดเรกทอรี other_files คุณจะต้องเพิ่มบล็อกการกำหนดค่าในการตั้งค่าเซิร์ฟเวอร์ โดยทั่วไปแล้วจะทำในไฟล์การกำหนดค่า Apache (ไม่ใช่ในไฟล์ .htaccess) นี่คือวิธีการ:

<Directory "/home/other_files">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

คำอธิบายการกำหนดค่า:

  • Options: ควบคุมตัวเลือกสำหรับไดเรกทอรี (เช่นการเปิดใช้งานการดัชนี)
  • AllowOverride: กำหนดว่าไดเรกทีฟใดสามารถถูกแทนที่โดย .htaccess
  • Order: กำหนดลำดับการควบคุมการเข้าถึง (ห้ามก่อน แล้วค่อยอนุญาต)
  • Deny/Allow: กำหนดว่า IP ใดบ้างที่อนุญาตให้เข้าถึงไดเรกทอรีนี้

ขั้นตอนที่ 2: ใช้คำสั่ง Alias (ไม่บังคับ)

หากคุณไม่ต้องการกำหนดค่า Apache โดยตรงเพื่อเปิดเผยไดเรกทอรี other_files คุณสามารถสร้าง Alias ที่แมพ URL ไปยังตำแหน่งจริงของไฟล์ได้ นี่คือลักษณะที่อาจเป็นไปได้:

Alias /doc/ "/home/other_files/"
<Directory "/home/other_files/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

โดยการใช้ Alias ตอนนี้คุณสามารถเขียน URL เช่น /doc/file.html เพื่อดึงไฟล์จากไดเรกทอรี other_files

ขั้นตอนที่ 3: เริ่มเซิร์ฟเวอร์ Apache ใหม่

เมื่อคุณทำการเปลี่ยนแปลงการกำหนดค่า Apache เหล่านี้แล้ว อย่าลืมรีสตาร์ทเซิร์ฟเวอร์เพื่อให้การตั้งค่าใหม่มีผล:

sudo service apache2 restart

สรุป

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

หากคุณยังมีปัญหาอยู่ให้ตรวจสอบการกำหนดค่าของคุณอีกครั้ง และไม่ลังเลที่จะหาข้อมูลเพิ่มเติมจากเอกสารประกอบการใช้งานอย่างเป็นทางการของ Apache Documentation สำหรับรายละเอียดเพิ่มเติม

โดยทำตามขั้นตอนเหล่านี้ คุณจะสามารถใช้ศักยภาพของ mod_rewrite ในขณะที่จัดการตำแหน่งไฟล์ภายในการตั้งค่าเซิร์ฟเวอร์ Apache ของคุณได้อย่างสำเร็จ!