CGI

来自维基百科

In computing, Common Gateway Interface (CGI) offers a standard protocol for web servers to execute programs that execute like Console applications (also called Command-line interface programs) running on a server that generates web pages dynamically. Such programs are known as CGI scripts or simply as CGIs. The specifics of how the script is executed by the server are determined by the server.[1] A CGI script essentially reads a query string and produces a HTML page.[2]

CGI接口定义了server如何执行脚本并返回一个HTML页面.

实际上, 在网络发展早期, 浏览器向服务器发送HTTP请求, 首先会到达Http Web Software, 如IIS, Apache, Nginx, Node-js服务器等. 然后这些服务器捕获了这些HTTP请求, 会解析出请求的内容, 并将具体的请求内容调用一些脚本或者程序, 执行完之后会组成html的输出, 返回给client端. CGI就是HTTP请求通过服务器软件传给脚本的接口定义.

This is usually done by marking a directory within the document collection as containing CGI scripts - its name is often cgi-bin. For example, /usr/local/apache/htdocs/cgi-bin could be designated as a CGI directory on the web server. When a Web browser requests a URL that points to a file within the CGI directory (e.g., http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string), then, instead of simply sending that file (/usr/local/apache/htdocs/cgi-bin/printenv.pl) to the Web browser, the HTTP server runs the specified script and passes the output of the script to the Web browser. That is, anything that the script sends to standard output is passed to the Web client instead of being shown on-screen in a terminal window.

由web server执行脚本, 但这里的脚本或者软件, 都应该是命令行的, 在web server中会有一个目录(虚拟, 总之是一个Dict结构, 映射了url和script的对应关系), 如果收到client的对文件的请求, web server就会把本来返回脚本文件的行为变为执行脚本, 然后返回脚本输出到标准输出的内容, 并返回给client.

As remarked above, the CGI standard defines how additional information passed with the request is passed to the script. For instance, if a slash and additional directory name(s) are appended to the URL immediately after the name of the script (in this example, /with/additional/path), then that path is stored in the PATH_INFO environment variable before the script is called. If parameters are sent to the script via an HTTP GET request (a question mark appended to the URL, followed by param=value pairs; in the example, ?and=a&query=string), then those parameters are stored in the QUERY_STRING environment variable before the script is called. If parameters are sent to the script via an HTTP POST request, they are passed to the script's standard input. The script can then read these environment variables or data from standard input and adapt to the Web browser's request.[10]

这里还涉及到对于HTTP请求方式的不同, 上面的例子上是当请求server software的脚本文件时,

请求是

http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string

如果是HTTP GET请求, 在请求脚本文件后还加了/with/additional/path, 这个会被保存在一个环境变量中PATH_INFO中, 而后面的请求参数也会被保存在一个环境变量QUERY_STRING中.

如果是HTTP POST请求, 在HTTP请求体里面的参数会被重定向到脚本的标准输入, 然后执行脚本.

FastCGI

FastCGI是CGI的一个变种, 是一个二进制协议, 目的在于减少server software和CGI pragrams的过度交互, 并使server可以一次处理多个请求. CGI Application是one request, one process, 效率比较低.

FastCGI可以认为是web server和application的中间层, FastCGI有一个一直存在的service process, 通过socket, pipe或者是TCP和web server的进程通信, 会不断把请求参数传递给application.

Python WSGI

WSGI(Web Server GateWay Interface)

在CGI和FastCGI之上, Python实现了WSGI, 作为对于使用Python开发web application时同web server的接口. WSGI中有middleware的概念, 类似于FastCGI, 也是中间层.

cgi_and_fastcgi的更多相关文章

随机推荐

  1. HDU 2586 How far away ? (LCA,Tarjan, spfa)

    题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离. 析:用LCA问题的Tarjan算法,利用并查集的优越性,产生把所有的点都储存下来,然后把所有的询问也储存下 ...

  2. Eclipse SVN 图标解释

    [转]http://blog.sina.com.cn/s/blog_64941c8101018dno.html - 已忽略版本控制的文件.可以通过Window → Preferences → Team ...

  3. [OpenGL]配置GLFW(超详细)

    注:本文可转载,转载请著名出处:http://www.cnblogs.com/collectionne/p/6937644.html.本文还会修改,如果不在博客园(cnblogs)发现本文,建议访问上 ...

  4. 洛谷 - P2424 - 约数和 - 整除分块

    https://www.luogu.org/problemnew/show/P2424 记 \(\sigma(n)\) 为n的所有约数之和,例如 \(\sigma(6)=1+2+3+6=12\) . ...

  5. POJ2752【KMP-next数组含义】

    题意: 给一个字符串,求满足既是这个字符串的前缀,又是这个字符串的后缀,从小到大输出长度 思路: 细讲next数组含义博文:点我 首先要满足前缀的呀. KMP的next数组干的是子串最长后缀. 所以从 ...

  6. Unity IK(反向运动学)初探

    http://blog.csdn.net/myarrow/article/details/44450199 1. 简介 IK与FK对应,正向运动学就是根骨骼带动节点骨骼运动.而反向运动学就是反过来,由 ...

  7. [Xcode 实际操作]一、博主领进门-(3)使用资源文件夹(Assets.xcassets)导入并管理图片素材

    目录:[Swift]Xcode实际操作 本文将演示如何使用资源文件夹(Assets.xcassets)导入并管理图片素材. [Assets.xcassets]资源文件夹可以方便的进行图片的管理, 在读 ...

  8. 黑马函数式接口学习 Stream流 函数式接口 Lambda表达式 方法引用

  9. TabBar背景颜色设置

    // 第一种方式 // [[UITabBar appearance] setBarTintColor:[UIColor blackColor]]; // [UITabBar appearance].t ...

  10. Mysql的跨服务器操作

    1.查询FEDERATED功能是否开启: show ENGINES; 2.如果状态为NO则需修改my.ini文件,增加一行federated配置: my.ini配置文件的默认路径 C:\Program ...