[Tech] Khắc phục lỗi 404 khi đổi server cho Wordpress

Vấn đề

Trang blog wordpress này (bỏ rồi, giờ qua Ghost) của mình trước kia dùng host của GoDaddy. Tốc độ hơi chậm mà lại không kiểm soát server nhiều được, với cả chấm điểm PageSpeed Insights chưa thoả mãn nên mới rục rịch chuyển sang Amazon EC2. Chuyển sang được ngon lành, vào trang chủ không một lỗi lầm, nhưng click vào các bài viết thì xuất hiện lỗi 404. Lỗi này khá phổ biến khi chuyển server như thế.

Not found error

Nguyên nhân

  • Bạn đang dùng một setting permalinks khác với mặc định (dạng mydomain.com/?p=123), và ở server mới thì bạn chưa có file .htaccess, hoặc có nhưng hạn chế quyền để WP có thể ghi được. Permalinks mặc định của WP không cần file .htaccess, trong khi các options còn lại thì cần.
  • Chưa bật mod rewrite của Apache.
  • Setting virtual host cho Apache chưa đúng.

Khắc phục

  • Bật module rewrite
sudo a2enmod rewrite
  • Kiểm tra xem WP có quyền ghi vào file .htaccess hay không. Vào trang Admin > Settings > Permalinks, nếu thấy bên dưới nút Save Changes có thông báo *If your .htaccess file were writable… *thì WP đang không thể ghi vào .htaccess. Đổi chown cho phù hợp và chmod 644.
    WordPress notice about .htaccess
sudo chmod 644 /path/to/.htaccess
  • Cho phép sử dụng .htaccess sau khi đã bật module rewrite của Apache và dùng mod_rewrite.c trong .htaccess (WP đã làm việc này ở bước trên rồi)
# open .conf file for edit
sudo nano /etc/apache2/sites-available/my-domain.com.conf
# edit file .conf
<VirtualHost *:80>
    ServerName my-domain.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
        <Directory /var/www/html>
            Options FollowSymLinks AllowOverride FileInfo
        </Directory>
</VirtualHost>
# restart apache to apply changes
sudo service apache2 restart
  • Vào lại Admin > Settings > Permalinks, chọn một option ưa thích và bấm Save Changes
  • Nếu vẫn chưa vào được từng bài viết, và WP vẫn báo không thể ghi file .htaccess, thì bạn phải tự sửa với nội dung như sau:
# BEGIN WordPress
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Tổng kết

Trên đây là cách khắc phục mình tổng hợp lại sau khi đọc rất nhiều bài hướng dẫn khác. Tóm lại thì lỗi này do chưa config nhà mới đúng cách nên WP không thể chạy nuột như ở nhà cũ. Việc chuyển nhà cho WP cũng khá dễ dàng, không cần chỉnh sửa gì nhiều hết, chỉ cần edit lại wp-config.php với DB mới rồi ôm tất cả sang. Thế là xong!