https://www.cnblogs.com/163yun/p/9834993.html

安装uhttpd。

在编译openwrt前,输入make memuconfig,查找Network -> Web Servers/Proxies -> uhttpd,如果没勾选则勾选。然后编译固件。

修改uhttpd配置。

安装运行openwrt后,通过ssh登陆,修改/etc/config/uhttpd配置文件,在文件末尾添加新的web服务。添加数据基本格式如下:

config 'uhttpd' 'ServerName' 

 option 'home' '/root/' 

 list 'listen_http' '0.0.0.0:8080' 

 option 'cgi_prefix' '/cgi-bin'

其中:

名称 说明
uhttpd 服务名称,不要和系统的重名即可
home 服务的根目录
listen_http CGI前缀,用来区分是否调用的CGI
cgi_prefix CGI前缀,用来区分是否调用的CGI

还有其他配置,不一一列举,比如index_page 、error_page 、listen_https、cert、key、script_timeout、network_timeout、tcp_keepalive等。
修改后需要重启uhttpd,使用命令:

/etc/init.d/uhttpd restart

配置静态页面。

在服务的根目录下配置web页面,比如index.html(如果uhttpd配置未指定,则为默认页面)。如下是一个网上找到的登陆网页:

<html> 
<head><title>..................</title></head> 
<body> 
<form name="form1" action="/cgi-bin/helloworld"> 
<table align="center"> 
<tr><td align="center" colspan="2"></td></tr> 
<tr> 
<td align="right">.........</td> 
<td><input type="text" name="Username"></td> 
</tr> 
<tr> 
<td align="right">...  ...</td> 
<td><input type="password" name="Password"></td> 
</tr> 
<tr> 
<td><input type="submit" value="...  ..."></td> 
<td><input type="reset" value="...  ..."></td> 
</tr> 
</table> 
</form> 
</body> 
</html>

当用户点击登陆时,会跳转访问当前目录下的/cgi-bin/helloworld。

编写CGI程序。

例如上一步的/cgi-bin/helloworld即为web服务的CGI程序。本文介绍通过ipk的方式安装CGI程序的方法。
生成ipk需要借助openwrt的交叉编译,首先在openwrt目录下的package目录下建立一个目录,本例为:helloworld。然后在helloworld目录下建立Makefile文件和src目录。其中Makefile文件的内如如下:

include (TOPDIR)/rules.mkPKGNAME:=helloworldPKGRELEASE:=1PKGBUILDDIR:=(BUILD_DIR)/(PKGNAME)include(INCLUDE_DIR)/package.mk 
define Package/helloworld   SECTION:=utils   CATEGORY:=Utilities   TITLE:=Helloworld – prints a snarky message 
endef 
define Package/helloworld/description   If you can't figure out what this program does, you're  probablybrain-dead and need immediate medical attention. 
endef 
define Build/Prepare   mkdir -p (PKGBUILDDIR)(CP) ./src/* $(PKG_BUILD_DIR)/ 
endef 
define Package/helloworld/install   (INSTALLDIR)(1)/root/cgi-bin/   $(INSTALL_BIN) (PKGBUILDDIR)/helloworld(1)/root/cgi-bin/ 
endef 
(eval(call BuildPackage,helloworld))

其中制定安装路径为web服务的CGI路径。
src目录下放入自己的程序及Makefile,本例中有:
helloworld.c内容如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>   void list_argument(void) 
{    char *env_var[] = {      "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",      "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",      "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",      "HTTP_HOST", "HTTP_USER_AGENT", "PATH",      "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",      "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",      "SERVER_SIGNATURE","SERVER_SOFTWARE", "CONTENT_LENGTH" };    char *value, i;      for (i=0; i<25; i++) {      value = getenv(env_var[i]);        if (value)      {   printf("<p>");          printf ( "%s = %s \n", env_var[i], value);   printf("<\p>");      }    } 
}   
int main(){ 
printf("Content-Type:text/html;charset=utf-8\n\n"); 
printf("<html>\n"); 
printf("<head>\n<title>test</title>\n</head>\n"); 
printf("<body>\n"); 
printf("<p>"); 
printf("hello~\n"); 
printf("</p>"); 
list_argument(); 
printf("</body>\n"); 
printf("</html>\n"); 
}

Makefile内容如下:

helloworld: helloworld.o 

 (CC)(LDFLAGS) helloworld.o -o helloworld 
helloworld.o: helloworld.c   (CC)(CFLAGS) -c helloworld.c 
clean:   rm *.o helloworldo

使用openwrt编译好后,把ipa通过scp上传到路由器下(或直接编译到固件中),安装:

opkg install helloworld_1_x86.ipk

之后就会在/root/cgi-bin下看见helloworld程序。调用程序能正常输出网页:

root@OpenWrt:~/cgi-bin# ./helloworld 
Content-Type:text/html;charset=utf-8   
<html> 
<head> 
<title>test</title> 
</head> 
<body> 
<P>hello</p></body> 
</html>

结果输出

浏览器就会打开默认页面(192.168.8.106是测试路由器地址),点击默认页面的确定按钮,就会返回CGI的输出,如下图:

hello~  
DOCUMENT_ROOT = /root  
GATEWAY_INTERFACE = CGI/1.1  
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8  
HTTP_ACCEPT_ENCODING = gzip, deflate  
HTTP_ACCEPT_LANGUAGE = zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3  
HTTP_CONNECTION = keep-alive  
HTTP_HOST = 192.168.8.106:8080  
HTTP_USER_AGENT = Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:29.0) Gecko/20100101 Firefox/29.0  
PATH = /sbin:/usr/sbin:/bin:/usr/bin  
QUERY_STRING = Username=11&Password=222  
REMOTE_ADDR = 192.168.8.103  
REMOTE_PORT = 53874  
REQUEST_METHOD = GET  
REQUEST_URI = /cgi-bin/helloworld?Username=11&Password=222  
SCRIPT_FILENAME = /root/cgi-bin/helloworld  
SCRIPT_NAME = /cgi-bin/helloworld  
SERVER_ADDR = 192.168.8.106  
SERVER_NAME = 192.168.8.106  
SERVER_PORT = 8080  
SERVER_PROTOCOL = HTTP/1.1  
SERVER_SOFTWARE = uHTTPd

3Openwrt自定义CGI实现 前后端交互的更多相关文章

  1. Django之META与前后端交互

    Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...

  2. nodejs实现前后端交互

    本人nodejs入门级选手,站在巨人(文殊)的肩膀上学习了一些相关知识,有幸在项目中使用nodejs实现了前后端交互,因此,将整个交互过程记录下来,方便以后学习. 本文从宏观讲述nodejs实现前后端 ...

  3. 微信小程序 + thinkjs + mongoDB 实现简单的前后端交互

    说明:这段时间跟老师学习了一下mongodb数据库,这次也是第一次搭建后台服务,出了不少差错,特此来复盘一下,非常感谢对我提供帮助的同学~ 一.使用 thinkjs + mongodb 创建后台服务 ...

  4. Node.js实现前后端交互——用户注册

    我之前写过一篇关于使用Node.js作为后端实现用户登陆的功能,现在再写一下node.js做后端实现简单的用户注册实例吧.另外需要说的是,上次有大佬提醒需要加密数据传输,不应该使用明文传输用户信息.在 ...

  5. Node之简单的前后端交互

    node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...

  6. 前后端交互实现(nginx,json,以及datatable的问题相关)

    1.同源问题解决 首先,在同一个域下搭建网络域名访问,需要nginx软件,下载之后修改部分配置 然后再终端下cmd  nginx.exe命令,或者打开nginx.exe文件,会运行nginx一闪而过, ...

  7. springboot+mybatis+thymeleaf项目搭建及前后端交互

    前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...

  8. 百度ueditor的图片上传,前后端交互使用

    百度ueditor的使用 一个文本编辑器,看了网上很多文档写的很乱,这里拾人牙慧,整理下怎么使用. 这个东西如果不涉及到图片附件上传,其实很简单,就是几个前端文件,直接引用,然后配置下ueditor. ...

  9. SSM-网站后台管理系统制作(4)---Ajax前后端交互

    前提:Ajax本身就为前后端交互服务的,实现功能:用户输入信息,实时判断用户的情况,这也是现在登录界面普遍流行的做法.前端js通过注释识别Controller层,该层查询返回,和之前Google验证码 ...

随机推荐

  1. 使用 JWT 生成 Token 代码示例

    JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...

  2. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. Markdown 语法文档

    Markdown 语法文档 前言 Markdown 是一种轻量级标记语言,创始人为約翰・格魯伯(英语:John Gruber); 它允许人们 "使用易读易写的纯文本格式编写文档,然后转换成有 ...

  4. SSD(single shot multibox detector)

    SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速 ...

  5. Javascript高级编程学习笔记(91)—— Canvas(8) 阴影

    阴影 2D上下文将会根据以下属性为形状或路径绘制阴影 shadowColor: 用于设置阴影颜色,默认为黑色 shadowOffsetX: 形状或路径X方向的阴影偏移量,默认为0 shadowOffs ...

  6. 【自然语言处理篇】--Chatterbot聊天机器人

    一.前述 ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei). 二.具体 1.安装 是的,安装超级简单, ...

  7. 【机器学习】--LDA初始和应用

    一.前述 LDA是一种 非监督机器学习 技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息.它采用了词袋(bag of words)的方法 ...

  8. kubernetes 存储卷

    kubernetes 存储卷    数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...

  9. LindDotNetCore~授权中间件的介绍

    回到目录 LindDotNetCore中间件 大叔认识中间件就是主要对http请求进行拦截,然后添加具体个性化功能的逻辑,这种把请求切开,添加新逻辑的方式一般称为面向方面的逻辑AOP! 授权中间件 请 ...

  10. 微信公众号开发C#系列-10、长链接转短链接

    1.概述 短网址的好处众多,便于记忆,占用字符少等,现在市面上出现了众多的将长网址转变为短网址的方法,但是由于他们都是小的公司在幕后运营,所以很不靠谱,面对随时关闭服务的可能,这样也导致我们将转换好了 ...