CGI初学踩坑
Last updated
Last updated
采用经典的 LAMP 作为服务器,以apache2为例在ubuntu 16.04 上默认安装路径/etc/apache2
其配置文件存放在两种类型文件夹*-available
. *-enabled
后者为正在使用的配置文件,被
include 到主配置文件中,前者为备用配置,可以复制到后者中重启apache生效
在apache2中,cgi默认文件夹为 :bug:/usr/lib/cgi-bin
:bug: 具体配置方式:
对于python3 进行CGI编程时,需要进行编码转换使用#-*-coding:utf-8-*-
无用,需要显示定义输出格式import codecs,sys
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer
对所有cgi程序而言如果需要用户调用,均需要更改其执行权限
chmod 755 file
对应权限为 -rwxr-xr-x
即所有者的读写执行,同组以及其他用户的读执行
对与使用wordpress时,若默认网站根目录为/var/www/wordpress 默认对用户可见的文件及文件夹的user group 均为www-data
具体可见/etc/apache2/envvars 文件中
对于上传文件时文件夹的 user . group必须设置为www-data
不可以时root
图中temp 文件夹用于存放用户上传的文件,需要更改所有者属性
以print输出,以'Content-type:text/html'作为文件的头标志,输出一个空行后,即可输出html代码,对于get /post方法获取的表单信息,需要引入cgi cgitb 模块,通过建立FieldStorage 实例获取信息
在html文件中使用cgi程序需要引入动作
action="/cgi-bin/script.py" method="post" target="_blank"
get
方法发送编码后的用户信息到服务端,数据会包含在请求页的url上
http://localhost/cgi-bin/hello_get.py?name=J.d&url=www.innohub.top&提交=提交
get
方法的注意事项:
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
post 方法传输数据是安全可靠的,一般用于用户密码信息的传送
补充html常用元素:
_t
:可以是 text, submit, checkbox, radio , file
_n
:相当于键值用于在Python中的FieldStorage对象获取某个指定选项
_v
:相当于键值对应的值,可用于输出
enctype上传文件
文件上传
cookies设置
http cookie的发送是通过http头部来实现的,他早于文件的传递,头部set-cookie的语法如下:
name=name: 需要设置cookie的值(name不能使用";"和","号),有多个name值时用 ";" 分隔,例如:name1=name1;name2=name2;name3=name3。
expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
domain=domain: 对cookie生效的域名,例如:domain="www.runoob.com"
secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。
cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息。