CGI trong lập trình web là gì? Cách dùng như thế nào?

CGI (Common Gateway Interface) là cách mở rộng chức năng của Web Server giúp tạo ra những nội dung động.

CGI trong lập trình web là gì? Cách dùng như thế nào?
CGI (Common Gateway Interface)

Một Web Server thông thường như Apache, Lighttpd hay Nginx v.v… chỉ hỗ trợ trả về nội dung tĩnh (static content) như HTML, JavaScript, CSS hoặc hình ảnh khi trình duyệt yêu cầu. Với CGI, Web Server hỗ trợ chức năng sinh ra nội dung động (dynamic content) theo context của người dùng từ phía trình duyệt gửi lên.

Khi có yêu cầu CGI từ trình duyệt, Web Server sẽ thực hiện lời gọi đến chương trình CGI (CGI script). Chương trình này sẽ xử lý dựa vào đầu vào của yêu cầu và phải trả về kết quả tương ứng trở lại trình duyệt.

CGI script có thể được viết bằng bất kỳ ngôn ngữ nào, miễn là nó có quyền executable.

Đầu vào 1: Các biến môi trường

Các biến môi trường chứa thông tin về Server và Request từ phía Client.

Thông tin về Server

Environment VariableMô tả
DOCUMENT_ROOTĐường dẫn đầy đủ đến Document Root trên máy chủ.
SERVER_ADMINĐịa chỉ email của người quản trị.
SERVER_NAMETên miền đầy đủ (fully qualified domain name).
SERVER_PORTCổng máy chủ web đang lắng nghe.
SERVER_PROTOCOLGiao thức Server sử dụng để xử lý request.
SERVER_SIGNATURE Chuỗi mô tả phiên bản của Server và tên của virtual host.
SERVER_SOFTWAREPhần mềm Web Server.
GATEWAY_INTERFACEPhiên bản specification của CGI đang được Server hỗ trợ.

Thông tin về Request

Environment VariableMô tả
QUERY_STRINGChuỗi tham số truyền vào URL của GET request.
REQUEST_METHODGET hoặc POST.
REQUEST_SCHEMEChuỗi giao thức của request.
REQUEST_URIĐường dẫn của request (phần đường dẫn sau tên miền)
AUTH_TYPEPhương thức bảo vệ trang (cấu hình AuthType trong .htaccess)
CONTENT_TYPEMIME type của dữ liệu gửi lên trong request body (POST).
CONTENT_LENGTHChiều dài dữ liệu trong Request Body (đơn vị bytes)
REMOTE_ADDRĐịa chỉ IP của Client.
REMOTE_HOSTHost name của máy Client nếu địa chỉ phía Client hỗ trợ reverse-name-lookups, còn không thì là địa chỉ IP của Client.
REMOTE_PORTCổng kết nối ở phía Client.
REMOTE_USERUser đăng nhập (nếu trang bảo vệ truy cập bằng .htaccess)
SCRIPT_FILENAMEĐường dẫn đầy đủ đến CGI script trên máy chủ.
SCRIPT_NAME Đường dẫn đến CGI script trên máy chủ (tương đối so với Document Root)
HTTPSGiá trị “on” nếu CGI script được gọi qua giao thức HTTPS

Các HTTP request header

Mỗi Request Header được lưu vào một biến môi trường có tên theo format: HTTP_{HEADER_NAME} (viết hoa và thay dấu “-” bằng dấu “_”). Ví dụ với header tên là User-Agent thì biến môi trường sẽ có tên là HTTP_USER_AGENT.

Một số request header hay gặp.

Environment VariableMô tả
HTTP_COOKIECookie trên máy client nếu có.
HTTP_HOSTHost name của Server được Client gửi yêu cầu.
HTTP_REFERERLiên kết trang web từ đó request được gửi.
HTTP_USER_AGENTThông tin về trình duyệt phía Client.

Đầu vào 2: STDIN

STDIN chứa phần body của POST request. Kích thước của body được chỉ định trong biến môi trường CONTENT_LENGTH. Lưu ý rằng CGI script không được phép đọc quá chiều dài của CONTENT_LENGTH.

Đầu ra: STDOUT

CGI script bắt buộc phải trả thông tin về client qua STDOUT chủ yếu bằng cách dùng các lệnh in ra màn hình. Thông tin này bao gồm Response Header và Response Body.

Dù bản thân Web Server cũng tạo ra các header cần thiết, Response Header tối thiểu phải có một trong 3 loại Content-Type, Status hoặc Location.

Cách cài đặt CGI trên Web Server

Tham khảo cách cài đặt CGI trên Apache 2 Web Server.

Thử xây dựng các ứng dụng CGI

Dưới đây là các demo CGI script viết bằng ngôn ngữ Bash Script.

Hiển thị tất cả biến môi trường

CGI script sau sẽ hiện ra trình duyệt tất cả các biến môi trường và giá trị của chúng.

/var/www/example/cgi-bin/env-vars.cgi

#!/bin/bash

echo "Content-type: text/html"
echo "" # mandatory

echo "<html>"
echo "<head>"
echo "<title>Environment Variables</title>"
echo "</head>"
echo "<body>"

echo "Environment Variables:"
echo "<pre>"
# Dump all environment variables and their values
/usr/bin/env
echo "</pre>"

echo "</body>"
echo "</html>"

exit 0

Xử lý GET request

CGI script sau thực hiện một phép cộng giữa 2 tham số A và B. Các tham số này được truyền qua GET gửi lên từ một <form>.

/var/www/example/cgi-bin/get-form.cgi

#!/bin/bash

A=0
B=0
RESULT=0

# Read the GET data from QUERY_STRING environment variable
if [ ! -z "${QUERY_STRING}" ]; then
    A=`echo "${QUERY_STRING}" | sed -n 's/^.*a=\([^&]*\).*$/\1/p'`
    B=`echo "${QUERY_STRING}" | sed -n 's/^.*b=\([^&]*\).*$/\1/p'`

    # Perform the calculation
    RESULT=$(($A + $B))
fi

echo "Content-type: text/html"
echo "" # mandatory

echo "<html>"
echo "<head>"
echo "<title>SUM Calculator</title>"
echo "</head>"
echo "<body>"

echo "<h1>Sum Calculator</h1>"
echo "<form method=\"GET\" action=\"${SCRIPT}\">"
echo "<input type=\"number\" name=\"a\" value=\"${A}\">"
echo " + "
echo "<input type=\"number\" name=\"b\" value=\"${B}\">"
echo " = ${RESULT} "
echo "<input type=\"submit\" value=\"Calculate\">"
echo "</form>"

echo "</body>"
echo "</html>"

exit 0

Xử lý POST request

CGI script sau thực hiện một phép nhân giữa 2 tham số A và B. Các tham số này được truyền qua POST gửi lên từ một <form>.

/var/www/example/cgi-bin/post-form.cgi

#!/bin/bash

A=0
B=0
RESULT=0

# Read the POST data from STDIN
read -n ${CONTENT_LENGTH} QUERY_STRING_POST
if [ ! -z "${QUERY_STRING_POST}" ]; then
    A=`echo "${QUERY_STRING_POST}" | sed -n 's/^.*a=\([^&]*\).*$/\1/p'`
    B=`echo "${QUERY_STRING_POST}" | sed -n 's/^.*b=\([^&]*\).*$/\1/p'`

    # Perform the calculation
    RESULT=$(($A * $B))
fi

echo "Content-type: text/html"
echo "" # mandatory

echo "<html>"
echo "<head>"
echo "<title>MULTIPLICATION Calculator</title>"
echo "</head>"
echo "<body>"

echo "<h1>Multiplication Calculator</h1>"
echo "<form method=\"POST\" action=\"${SCRIPT}\">"
echo "<input type=\"number\" name=\"a\" value=\"${A}\">"
echo " x "
echo "<input type=\"number\" name=\"b\" value=\"${B}\">"
echo " = ${RESULT} "
echo "<input type=\"submit\" value=\"Calculate\">"
echo "</form>"

echo "</body>"
echo "</html>"

exit 0

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.