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. Spring的历史及哲学

    Spring的历史和哲学 1.Spring 历史 时间回到2002年,当时正是 Java EE 和 EJB 大行其道的时候,很多知名公司都是采用此技术方案进行项目开发.这时候有一个美国的小伙子认为 E ...

  2. markdown用法

    Markdown 语法的目标是成为一种适用于网络的书写语言.不在 Markdown 涵盖范围之内的标签,都可以直接在文档里面用 HTML 撰写.不需要额外标注,只要直接加标签就可以了. 一.常用部分 ...

  3. 怎么隐藏 iOS Safari 打开网页时的地址栏和工具栏探索

    先来看一张截图 红色框处就是用手机浏览器打开页面时,自动显示出来的头部地址栏和底部工具栏 如果现在有一个需求,用手机浏览器打开页面时,把地址栏和工具栏隐藏,该怎么办呢? 起初我在度娘找到了好几篇博客都 ...

  4. 每日分享!~ vue JavaScript中为什么可以读取到字符串的长度!(包装对象)

    首先需要知道什么是包装对象? 对象是JavaScript语言下最主要的数据类型,三种原始的值-----数值,字符串,布尔值,在一定条件下会自动的转为对象.也就是原始类型的包装对象: 也就是通过如下方式 ...

  5. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║Vue基础:JS面向对象&字面量& this字

    缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...

  6. MacBook PyCharm激活码(附视频)

    Windows激活请看这里:pyCharm最新2019激活码 此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrain ...

  7. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  8. 谷歌浏览器的各个版本对应的webdriver(chromedrive)-超级详细

    简介 近来看到各个测试群里的小伙伴由于安装的谷歌浏览器版本各不相同,有高有低,这可是难住愁坏了一大批人,所以都在要各种版本的谷歌浏览器相对应的chromedrive,为此找了一个淘宝镜像网址供大家下载 ...

  9. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用

    知识点 旅行商问题的线性规划模型旅行商问题的+Leapms模型及CPLEX求解C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1个城 ...