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.
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.
Mục lục
Đầ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 Variable | Mô 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_NAME | Tên miền đầy đủ (fully qualified domain name). |
SERVER_PORT | Cổng máy chủ web đang lắng nghe. |
SERVER_PROTOCOL | Giao 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_SOFTWARE | Phần mềm Web Server. |
GATEWAY_INTERFACE | Phiên bản specification của CGI đang được Server hỗ trợ. |
Thông tin về Request
Environment Variable | Mô tả |
---|---|
QUERY_STRING | Chuỗi tham số truyền vào URL của GET request. |
REQUEST_METHOD | GET hoặc POST. |
REQUEST_SCHEME | Chuỗ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_TYPE | Phương thức bảo vệ trang (cấu hình AuthType trong .htaccess) |
CONTENT_TYPE | MIME type của dữ liệu gửi lên trong request body (POST). |
CONTENT_LENGTH | Chiều dài dữ liệu trong Request Body (đơn vị bytes) |
REMOTE_ADDR | Địa chỉ IP của Client. |
REMOTE_HOST | Host 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_PORT | Cổng kết nối ở phía Client. |
REMOTE_USER | User đă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) |
HTTPS | Giá 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 Variable | Mô tả |
---|---|
HTTP_COOKIE | Cookie trên máy client nếu có. |
HTTP_HOST | Host name của Server được Client gửi yêu cầu. |
HTTP_REFERER | Liên kết trang web từ đó request được gửi. |
HTTP_USER_AGENT | Thô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