CGI (là viết tắt của Common Gateway Interface) là một tập hợp các chuẩn mà định nghĩa cách thông tin được trao đổi giữa Web Server và một Custom Script.
Trước khi tiến hành lập trình CGI, bạn đảm bảo rằng Web Server của bạn hỗ trợ CGI và được cấu hình để xử lý các chương trình CGI. Tất cả chương trình CGI được thực thi bởi HTTP đều được giữ trong một thư mục đã được cấu hình trước.
Thư mục này được gọi là CGI Directory và theo qui ước nó được đặt tên dạng /var/www/cgi-bin. Các CGI file có đuôi là .cgi, nhưng bạn cũng có thể giữ các file trong .py.
Theo mặc định, Linux Server được cấu hình để chạy các script trong thư mục cgi-bin trong /var/www. Nếu bạn muốn xác định bất kỳ thư mục nào khác để chạy CGI script của bạn, thì bạn comment các dòng sau trong httpd.conf file:
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Dòng Content-type:text/html\r\n\r\n là một phần của HTTP Header mà được gửi tới trình duyệt để giúp trình duyệt hiểu nội dung cần được hiển thị. Tất cả HTTP Header sẽ là trong form sau:
HTTP Ten Truong: Noi Dung Cua Truong Vi du Content-type: text/html\r\n\r\n
Dưới đây là một số HTTP Header quan trọng khác mà bạn sẽ sử dụng thường xuyên trong lập trình CGI:
Header | Miêu tả |
---|---|
Content-type: | Một chuỗi MIME định nghĩa định dạng của file được trả về. Ví dụ Content-type:text/html |
Expires: Date | Ngày mà thông tin trở nên hết hiệu lực. Nó được sử dụng bởi trình duyệt để xác định khi nào trang cần được refresh. Một chuỗi date hợp lệ là trong định dạng 01 Jan 1998 12:00:00 GMT. |
Location: URL | URL mà được trả về thay cho URL đã được yêu cầu. Bạn có thể sử dụng trường này để chuyển hướng một yêu cầu tới bất kỳ file nào |
Last-modified: Date | Ngày sửa đổi cuối cùng của nguồn |
Content-length: N | Độ dài (số byte) của dữ liệu đang được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian download ước lượng cho một file |
Set-Cookie: String | Thiết lập cookie được truyền thông qua String |
Tất cả chương trình CGI có quyền truy cập tới các biến môi trường sau. Các biến này đóng một vai trò quan trọng trong khi viết bất cứ chương trình CGI nào.
Tên biến | Miêu tả |
---|---|
CONTENT_TYPE | Kiểu dữ liệu của nội dung. Được sử dụng khi Client đang gửi nội dung đính kèm tới Server. Ví dụ: file upload |
CONTENT_LENGTH | Độ dài của thông tin truy vấn. Chỉ có sẵn cho các yêu cầu POST |
HTTP_COOKIE | Trả về các Cookie đã thiết lập trong dạng là cặp key/value |
HTTP_USER_AGENT | Trường User-Agent chứa thông tin về user agent tạo yêu cầu. Đây là tên của trình duyệt web |
PATH_INFO | Path cho CGI script |
QUERY_STRING | Thông tin mã hóa URL được gửi với phương thức GET |
REMOTE_ADDR | Địa chỉ IP của host từ xa mà tạo yêu cầu. Biến này hữu ích cho log và xác nhận |
REMOTE_HOST | Tên đầy đủ của host tạo yêu cầu. Nếu thông tin này không có sẵn, thì REMOTE_ADDR có thể được sử dụng để lấy địa chỉ IP |
REQUEST_METHOD | Phương thức được sử dụng để tạo yêu cầu. Phương thức được sử dụng phổ biên là GET và POST |
SCRIPT_FILENAME | Path đầy đủ tới CGI script |
SCRIPT_NAME | Tên của CGI script |
SERVER_NAME | Tên của CGI script |
SERVER_SOFTWARE | Tên và phiên bản của phần mềm mà Server đang chạy trên đó |
Chương trình CGI sau sẽ liệt kê tất cả các biến CGI.
import os print "Content-type: text/html\r\n\r\n"; print "<font size=+1>Environment</font><\br>"; for param in os.environ.keys(): print "<b>%20s</b>: %s<\br>" % (param, os.environ[param])
Phương thức GET gửi thông tin người dùng đã mã hóa được phụ thêm tới yêu cầu trang. Trang và thông tin mã hóa được phân biệt bởi ký tự ? như sau:
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
Phương thức GET là phương thức mặc định để truyền thông tin từ trình duyệt tới Web Server và nó tạo ra một chuỗi dài xuất hiện trong Location:box của trình duyệt.
Nếu bạn có password hoặc bất cú thông tin nhạy cảm nào khác cần truyền tới Server thì bạn đừng bao giờ sử dụng phương thức GET. Phương thức GET có giới hạn kích cỡ: chỉ có 1024 ký tự có thể được gửi trong một chuỗi yêu cầu. Phương thức GET gửi thông tin bởi QUERY_STRING Header và sẽ là có thể truy cập trong chương trìn CGI thông qua biến môi trường QUERY_STRING.
Bạn có thể truyền thông tin bằng cách đơn giản là nối chuỗi các cặp key và value cùng với bất cứ URL nào hoặc bạn có thể sử dụng thẻ form trong HTML.
Một phương thức đáng tin cậy hơn để truyền thông tin tới một chương trình CGI là phương thức POST. Phương thức này đóng gói thông tin theo đúng như cách của phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi text sau một dấu ? trong URL, thì nó gửi dưới dạng một thông điệp riêng rẽ. Thông điệp này vào trong CGI script trong dạng đầu vào chuẩn.
Ví dụ sau cũng sử dụng hello_get.py ở trên.
# Import cac module de xu ly CGI import cgi, cgitb # Tao instance cua FieldStorage form = cgi.FieldStorage() # Lay du lieu tu cac truong first_name = form.getvalue('first_name') last_name = form.getvalue('last_name') print "Content-type:text/html\r\n\r\n" print "<html>" print "<head>" print "<title>Chuong trinh CGI thu hai</title>" print "</head>" print "<body>" print "<h2>Hello %s %s</h2>" % (first_name, last_name) print "</body>" print "</html>"
Sử dụng lại ví dụ trên để truyền hai giá trị bởi sử dụng HTML form và nút submit.
<form action="/cgi-bin/hello_get.py" method="post"> First Name: <input type="text" name="first_name"><br /> Last Name: <input type="text" name="last_name" /> <input type="submit" value="Submit" /> </form>
» Tin mới nhất:
» Các tin khác: