Ngày đăng: October 18, 2023
Apache là máy chủ web phổ biến nhất trên thế giới. Nó được hỗ trợ tốt với nhiều tính năng và sự linh hoạt. Khi thiết kế các trang web của bạn, việc tùy chỉnh từng phần nội dung mà người dùng của bạn sẽ thấy thường rất hữu ích. Điều này bao gồm các trang lỗi (error pages) khi họ yêu cầu nội dung không có sẵn. Trong hướng dẫn này, chúng tôi sẽ trình bày cách định cấu hình Apache để sử dụng các trang lỗi tùy chỉnh trên Ubuntu 14.04.
Để bắt đầu với hướng dẫn này, bạn sẽ cần một non-root user với đặc quyền sudo
. Bạn có thể thiết lập loại user này bằng cách làm theo hướng dẫn thiết lập ban đầu của chúng tôi cho Ubuntu 14.04. Bạn cũng sẽ cần cài đặt Apache trên hệ thống của mình. Tìm hiểu cách thiết lập tính năng này bằng cách làm theo bước đầu tiên của hướng dẫn Cách cài đặt ngăn xếp Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 14.04.
Chúng tôi sẽ tạo một số trang lỗi tùy chỉnh để trình bày, nhưng các trang tùy chỉnh của bạn rõ ràng sẽ khác.
Chúng tôi sẽ đặt các trang lỗi tùy chỉnh của mình vào thư mục /var/www/html
nơi cài đặt Apache của Ubuntu đặt gốc tài liệu mặc định của nó. Chúng tôi sẽ tạo một trang dành cho các lỗi 404 có tên là custom_404.html
và một trang dành cho các lỗi level 500 chung có tên là custom_50x.html
. Bạn có thể sử dụng các dòng sau nếu bạn chỉ đang thử nghiệm. Nếu không, hãy đặt nội dung của riêng bạn vào các vị trí sau:
- echo "<h1 style='color:red'>Error 404: Not found :-(</h1>" | sudo tee /var/www/html/custom_404.html
- echo "<p>I have no idea where that file is, sorry. Are you sure you typed in the correct URL?</p>" | sudo tee -a /var/www/html/custom_404.html
- echo "<h1>Oops! Something went wrong...</h1>" | sudo tee /var/www/html/custom_50x.html
- echo "<p>We seem to be having some technical difficulties. Hang tight.</p>" | sudo tee -a /var/www/html/custom_50x.html
Hiện tại, chúng tôi có hai trang lỗi tùy chỉnh mà chúng tôi có thể phân phát khi yêu cầu của khách hàng dẫn đến các lỗi khác nhau.
Bây giờ, chúng ta chỉ cần nói với Apache rằng nó nên sử dụng các trang này bất cứ khi nào xảy ra điều kiện lỗi chính xác. Mở tệp máy chủ ảo trong thư mục /etc/apache2/sites-enabled
mà bạn muốn định cấu hình. Chúng tôi sẽ sử dụng tệp server block mặc định có tên 000-default.conf
, nhưng bạn nên điều chỉnh các server block của riêng mình nếu bạn đang sử dụng tệp không phải mặc định:
- sudo nano /etc/apache2/sites-enabled/000-default.conf
Bây giờ chúng ta có thể trỏ Apache tới các trang lỗi tùy chỉnh của mình.
Chúng ta có thể sử dụng chỉ thị ErrorDocument
để liên kết từng loại lỗi với một trang lỗi liên quan. Điều này có thể được đặt trong máy chủ ảo hiện được xác định. Về cơ bản, chúng tôi chỉ cần map (ánh xạ) mã trạng thái http của từng lỗi tới trang mà chúng tôi muốn phân phát khi lỗi đó xảy ra.
Trong ví dụ của chúng tôi, mapping lỗi sẽ trông như thế này:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
</VirtualHost>
Chỉ riêng thay đổi này cũng đủ để phục vụ các trang lỗi tùy chỉnh khi xảy ra lỗi được chỉ định.
Tuy nhiên, chúng tôi sẽ thêm một bộ cấu hình bổ sung để khách hàng không thể trực tiếp yêu cầu các trang lỗi của chúng tôi. Điều này có thể ngăn chặn một số tình huống lạ khi văn bản của trang tham chiếu đến lỗi nhưng trạng thái http lại là “200” (cho biết yêu cầu thành công).
Để triển khai hành vi này, chúng tôi sẽ cần thêm block Files
cho mỗi trang tùy chỉnh của mình. Bên trong, chúng ta có thể kiểm tra xem biến môi trường REDIRECT_STATUS
có được đặt hay không. Điều này chỉ nên được đặt khi lệnh ErrorDocument
xử lý một yêu cầu. Nếu biến môi trường trống, chúng tôi sẽ đưa ra lỗi 404:
<VirtualHost *:80>
. . .
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
<Files "custom_404.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_404.html$
</If>
</Files>
<Files "custom_50x.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_50x.html$
</If>
</Files>
</VirtualHost>
Khi các trang lỗi được khách hàng yêu cầu trực tiếp, lỗi 404 sẽ xảy ra do biến môi trường chính xác không được đặt.
Chúng tôi có thể dễ dàng tạo ra lỗi 404 để kiểm tra cấu hình của mình bằng cách yêu cầu nội dung không tồn tại. Để kiểm tra lỗi level 500, chúng tôi sẽ phải thiết lập một thẻ proxy giả để có thể đảm bảo rằng các trang chính xác được trả về.
Thêm chỉ thị ProxyPass
vào cuối máy chủ ảo. Gửi yêu cầu /proxytest
tới cổng 9000 trên máy cục bộ (nơi không có dịch vụ nào đang chạy):
<VirtualHost *:80>
. . .
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
<Files "custom_404.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_404.html$
</If>
</Files>
<Files "custom_50x.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_50x.html$
</If>
</Files>
ProxyPass /proxytest "http://localhost:9000"
</VirtualHost>
Lưu và đóng tập tin khi bạn hoàn tất.
Bây giờ, hãy kích hoạt các mô-đun mod_proxy
và mod_proxy_http
bằng cách gõ:
- sudo a2enmod proxy
- sudo a2enmod proxy_http
Kiểm tra lỗi cú pháp trong tệp cấu hình của bạn bằng cách nhập:
- sudo apache2ctl configtest
Giải quyết mọi vấn đề được báo cáo. Khi tệp của bạn không có lỗi cú pháp, hãy khởi động lại Apache bằng cách gõ:
- sudo service apache2 restart
Bây giờ, khi bạn truy cập miền hoặc địa chỉ IP của máy chủ và yêu cầu một tệp không tồn tại, bạn sẽ thấy trang 404 mà chúng tôi thiết lập:
http://server_domain_or_IP/thiswillerror
Khi bạn đi đến vị trí mà chúng tôi đã thiết lập cho thẻ proxy giả, chúng tôi sẽ nhận được lỗi “503 service unavailable” (503 dịch vụ không khả dụng) với trang level 500 tùy chỉnh của chúng tôi:
Bây giờ bạn có thể quay lại và xóa dòng truyền proxy giả khỏi cấu hình Apache của mình. Bạn có thể tắt các mô-đun proxy nếu bạn không cần sử dụng chúng ở nơi khác:
- sudo a2dismod proxy
- sudo a2dismod proxy_http
Khởi động lại máy chủ một lần nữa để thực hiện những thay đổi đó:
- sudo service apache2 restart
Bây giờ bạn sẽ phân phát các trang lỗi tùy chỉnh cho trang web của mình. Đây là một cách dễ dàng để cá nhân hóa trải nghiệm của người dùng ngay cả khi họ đang gặp sự cố. Một gợi ý cho những trang này là đưa vào các liên kết tới các địa điểm mà họ có thể đến để nhận trợ giúp hoặc biết thêm thông tin. Nếu bạn thực hiện việc này, hãy đảm bảo rằng các đích liên kết có thể truy cập được ngay cả khi xảy ra lỗi liên quan.