การตั้งค่า $baseURL ใน CodeIgniter 4 แบบไม่ Hardcode Domain
การกำหนดค่า $baseURL ใน CodeIgniter 4 โดยไม่ระบุโดเมนแบบตายตัว (Hardcode) ช่วยให้ระบบสามารถย้ายเซิร์ฟเวอร์ เปลี่ยนโดเมน หรือแยก Environment (Development / Production) ได้โดยไม่ต้องแก้ไขโค้ดหลัก ลดความผิดพลาดและเพิ่มความยืดหยุ่นของระบบอย่างมืออาชีพ
วิธีที่ 1: ใช้ไฟล์ .env (แนะนำสำหรับ Production)
เป็นวิธีมาตรฐานของ CodeIgniter 4 และเหมาะสำหรับระบบใช้งานจริง
ขั้นตอนที่ 1: ตั้งค่า Default ในไฟล์ App.php
ตำแหน่งไฟล์: app/Config/App.php
public string $baseURL = 'http://localhost:8080/';
ให้คงค่า Default ไว้แบบนี้ โดยไม่ต้องระบุโดเมนจริงในไฟล์นี้
ขั้นตอนที่ 2: กำหนดค่าในไฟล์ .env
ตำแหน่งไฟล์: /.env (Root ของโปรเจกต์)
app.baseURL = 'https://your-domain.com/'
หมายเหตุ: ต้องมีเครื่องหมาย / ปิดท้ายเสมอ
ข้อดีของวิธีนี้
- แยกค่า Development และ Production ได้ชัดเจน
- ไม่ต้องแก้โค้ดเมื่อย้ายเซิร์ฟเวอร์
- ลดความเสี่ยงด้านความปลอดภัย
- เหมาะกับระบบที่มี CI/CD
วิธีที่ 2: ตั้งค่า Auto-Detect URL อัตโนมัติ
เหมาะสำหรับงานทดสอบหรือระบบภายใน
ตำแหน่งไฟล์: app/Config/App.php
public string $baseURL = '';
public function __construct()
{
parent::__construct();
$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$this->baseURL = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/';
}
ระบบจะดึง Protocol และ Host ปัจจุบันมาสร้าง URL อัตโนมัติ
ข้อควรระวัง
การดึงค่า Host จาก $_SERVER อาจมีความเสี่ยงด้านความปลอดภัย เช่น Host Header Injection หาก Web Server ไม่ได้ตั้งค่าป้องกันอย่างเหมาะสม จึงไม่แนะนำสำหรับ Production ที่ต้องการความปลอดภัยสูง
เรื่องสำคัญ: Trailing Slash ต้องมีเสมอ
| ถูกต้อง | ไม่ถูกต้อง |
|---|---|
| https://example.com/ | https://example.com |
| http://localhost:8080/ | http://localhost:8080 |
หากไม่มีเครื่องหมาย / ปิดท้าย อาจทำให้ฟังก์ชัน base_url() และ site_url() ทำงานผิดพลาด
สรุป
- ระบบใช้งานจริง: ใช้ไฟล์
.env - ระบบทดลอง: ใช้ Auto-Detect ได้
- Production ควรหลีกเลี่ยงการพึ่งพา
$_SERVERโดยตรง
การแยก Environment ออกจากโค้ดหลักเป็นแนวทางมาตรฐานของระบบที่รองรับการขยายตัวในอนาคต และช่วยให้การดูแลระบบทำได้อย่างมืออาชีพมากยิ่งขึ้น