วิธีแก้ 404 Page not found เมื่อ deploy website ขึ้น web hosting

NottDev
2 min readMar 15, 2020

--

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

ปัญหาที่พบ!!

เมื่อเราพัฒนาเว็บไซต์จนถึงขั้นตอนที่เรานำ build file ไป deploy ขึ้น web hosting โดยส่วนใหญ่ที่ใช้จะมี 2 แบบ คือ Apache และ Nginx ซึ่งปัญหาที่พบคือ เมื่อ Request บาง URL จะขึ้น Error 404 Page Not Found ดังตัวอย่างด้านล่าง

  1. Apache
Error 404 Page Not Found on Apache Web Server

2. Nginx

Error 404 Page Not Found on Nginx Web Server

วิธีแก้ไข

สำหรับบทความนี้จะแนะนำวิธีการแก้ไขปัญหาของ web server ทั้ง 2 แบบ

Apache

สำหรับ RHEL

  1. เปิด rewrite module
  • เปิดไฟล์ Config เพื่อทำการแก้ไข
$ sudo nano /etc/httpd/conf/httpd.conf
  • นำคอมเม้นท์ด้านหน้า(#) ออก
LoadModule rewrite_module modules/mod_rewrite.so

2. แก้ไข AllowOverride

  • เปิดไฟล์ Config เพื่อแก้ไข
$ sudo nano /etc/httpd/conf/httpd.conf
  • แก้ไข AllowOverride ในส่วนของ <Directory /var/www/html>
AllowOverride None เปลี่ยนจาก None เป็น AllAllowOverride All
  • จากนั้น Restart apache
$ sudo service httpd restart

// หรือ CentOS/RHEL เวอร์ชั่น 7.x ขึ้นไป
$ sudo systemctl restart httpd.service

สำหรับ Ubuntu

  1. เปิด rewrite module

เปิด rewrite module ด้วยคำสั่งนี้

$ sudo a2enmod rewrite$ sudo systemctl restart apache2 
หรือ
$ sudo service apache2 reload

**เพิ่มเติม

// เปิด rewrite module
$ sudo a2enmod rewrite
// ปิด rewrite module
$ sudo a2dismod rewrite
// เช็ค rewrite module
$ sudo a2query -m rewrite

2. แก้ไขไฟล์ Config

  • เปิดไฟล์ Config เพื่อแก้ไข
nano /etc/apache2/sites-available/000-default.conf
  • เพิ่มคำสั่งด้านล่างใน <VirtualHost>
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
  • จากนั้น Restart apache
$ sudo systemctl restart apache2

ส่วนสุดท้ายคือ เพิ่มไฟล์ .htaccess ใน document root (/public_html) ของโปรเจค

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>

เป็นอันเสร็จพิธี :)

httpd is the same as apache2. It depends on the OS you use. For example in RHEL it is called httpd and in Ubuntu it is called apache2.

Nginx

  • เปิดไฟล์ Config เพื่อแก้ไข
$ sudo nano /etc/nginx/conf.d/default.conf
  • เพิ่ม try_files ใน block server ส่วนของ location ดังตัวอย่างด้านล่าง
location / {
...
try_files $uri $uri/ /index.html;
}
  • จากนั้น Restart Nginx
$ sudo service nginx restart             หรือ$ sudo systemctl restart nginx

เป็นอันเสร็จพิธี :)

Reference:

(ข้อมูลอาจมีข้อผิดพลาด ถ้าจะเอาบทความนี้ไปอ้างอิงที่อื่นให้ตรวจสอบให้ดีก่อนนะครับ ขอบคุณครับ)

สำหรับวันนี้ ต้องขอลาไปก่อน สวัสดีครับ NottDev :)

--

--

NottDev
NottDev

Written by NottDev

Your only limit is your mind.

Responses (1)