文章目录
静态网页工作原理
这里以上一节博客中案例test_01.html
文件为例。(类比图中的a.html)
浏览器通过访问我的TCP服务器(Web服务器,boa),请求获得test01_html文件的信息。
服务器(boa)在接收到这个请求以后,就会去解析该请求
在我们对应的资源目录文件中去寻找请求文件
改资源目录是由上一届中对boa进行配置的文件路径。
服务器找到对应的文件以后,便打开此请求文件
,读取此文件中的数据,将该信息与响应头
(响应头指的是对请求文件的响应信息,后面会详细介绍)合并。然后返回发送给用户浏览器
动态网页工作原理
所谓动态网页,指的是网页上的数据在不断的进行更新的一个概念,区别于静态网页一层不变的概念。
比如我们要采集光照强度和温度的数据,显然这个数据是随着时间在不断变化的一个过程,因此为了实现这样的一个数据不断更新的功能,引入了动态网页的技术。
其难点,就在如何让服务器知道用户请求的是一个静态网页(固定的内容的文本文件),还是一个动态网页(由某个程序代码来产生了需要的文本文件)
因此,我们引入了CGI
CGI的概念
CGI(Common Gateway Interface,公共网关接口)是Web服务器运行时外部程序的规范
,按CGI编写的程序可以扩展服务器功能。CGI应用程序能与浏览器交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档
后,发送给浏览器,也可以将从浏览器获得的数据放入到数据库中。
CGI工作原理
如上图,其本质就是在两道程序中,充当了一个中间者的角色。因为我们的数据产生本身是一个进程,我们的服务器也是一个进程。所以,如果直接将数据发送给我们的服务器,显然就得解决两者的进程间通信的问题。,而有了CGI以后,我们只需要按照CGI的标准来写程序,就能将数据以动态的形式由服务器发送给用户浏览器。
boa配置静态文件与CGI文件访问路径
静态文件
这是我们上一节博客配置的资源路径。这里为了方便我们区分,我们将此路径进行更改
CGIPath
CGIPath指的时CGI运行时的环境变量,其目的是告诉服务器,CGI程序的运行路径。
动态网页
这里就是我们今天需要进行修改的地方,其中/cgi-bin/ 指的就是当我们访问的文件带有cgi-bin字段的时候,就表示访问的动态网页信息,因此我们的服务器,就会从后面的路径/usr/lib/cgi-bin/下去找此文件
修改如下
新的资源目录结构如下
测试一下,以test_01.html文件为例。配置完后需要要重启下服务器
成功
以shell语言,实现动态网页案例
我们编写一个时间的shell脚本,放入到cgi目录下
修改time的权限
chmod 777 time
执行
第一次访问测试
修改源代码
出错原因这与http协议要求有关
。http协议要求,响应的数据格式为
状态行,由boa服务器替我们添加上,但是消息报头和空行是需要我们自己补上的。至于为什么非要按这个要求来,我猜测与网络安全有关
修改如下
第二次测试
成功
C语言测试
编写测试程序和Makefile
创建一个工作目录
test_time.c
#include<stdio.h>
#include"time.h"
int main(){
char *head_title="C语言测试";
printf("Content-Type:text/html;charset=utf-8\r\n");
printf("\r\n");
printf("<h1>%s</h1>",head_title);
printf("<h2>%s</h2>",get_time(0));
return 0;
}
time.h
#ifndef TIME_H
#define TIME_H
#include<time.h>
extern char* get_time(time_t now);
#endif
time.c
#include<stdio.h>
#include"time.h"
#include<string.h>
#include<stdlib.h>
char* get_time(time_t now){
struct tm *local;
static char res[16]={0};//存储时间
if(now<0){
time(NULL);
}else{
time(&now);
}
local=localtime(&now);
if(local==NULL){
perror("获取时间错误");
exit(-1);
}
snprintf(res,sizeof(res),"%02d:%02d:%02d",local->tm_hour,local->tm_min,local->tm_sec);
return res;
}
Makefile
TARGET := time
OBJ :=time.o
OBJ +=test_time.o
CROSS_COMPILE :=
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
CFLAGS := -Wall -I ../inc
LDFALGS :=
OUTPUT_DIR :=/home/jacky/www/cgi
all:$(TARGET)
$(TARGET):$(OBJ)
$(CC) $(LDFALGS) -o $@ $^
mv $(TARGET) $(OUTPUT_DIR)
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $^
.PHONY clean:
rm -rf $(OBJ) $(TARGET)
执行make
测试浏览器
成功