当前位置: 首页 > news >正文

佛山网站推广优化网页游戏网页版

佛山网站推广优化,网页游戏网页版,wordpress图片自动分页插件,甘肃省水利工程建设网站最近#xff0c;终于要把《WEB请求处理系列》提上日程了#xff0c;一直答应小伙伴们给分享一套完整的WEB请求处理流程#xff1a;从浏览器、Nginx、Servlet容器#xff0c;最终到应用程序WEB请求的一个处理流程#xff0c;前段时间由于其他工作事情的安排#xff0c;一直…最近终于要把《WEB请求处理系列》提上日程了一直答应小伙伴们给分享一套完整的WEB请求处理流程从浏览器、Nginx、Servlet容器最终到应用程序WEB请求的一个处理流程前段时间由于其他工作事情的安排一直未进行整理。不过还好该系列终于启动了给大家分享的同时也顺便整理下自己的思路以便温故而知新吧。希望大家都能在此过程中得到新的收获吧。 本系列主要分五部分 1.《WEB请求处理一浏览器请求发起处理》分析用户在浏览器中输入URL地址浏览器如何找到服务器地址的过程并发起请求 2.《WEB请求处理二Nginx请求反向代理》分析请求在达反向代理服务器内部处理过程 3.《WEB请求处理三Servlet容器请求处理》分析请求在Servlet容器内部处理过程并找到目标应用程序 4.《WEB请求处理四WEB MVC框架请求处理》分析请求在应用程序内部开源MVC框架的处理过程 5.《WEB请求处理五浏览器请求响应处理》分析请求在服务器端处理完成后浏览器渲染响应页面过程 为直观明了先上一张图红色部分为本章所述模块 本章所述模块 1 B/S网络架构概述# 我们先了解下B/S网络架构是什么B/S网络架构从前端到后端都得到了简化都基于统一的应用层协议HTTP来交互数据HTTP协议采用无状态的短链接的通信方式通常情况下一次请求就完成了一次数据交互通常也对应一个业务逻辑然后这次通信连接就断开了。采用这种方式是为了能够同时服务更多的用户因为当前互联网应用每天都会处理上亿的用户请求不可能每个用户访问一次后就一直保持住这个连接。 当一个用户在浏览器里输入www.google.com这个URL时将会发生如下操作 首先浏览器会请求DNS把这个域名解析成对应的IP地址 然后根据这个IP地址在互联网上找到对应的服务器建立Socket连接向这个服务器发起一个HTTP Get请求由这个服务器决定返回默认的数据资源给访问的用户 在服务器端实际上还有复杂的业务逻辑服务器可能有多台到底指定哪台服务器处理请求这需要一个负载均衡设备来平均分配所有用户的请求 还有请求的数据是存储在分布式缓存里还是一个静态文件中或是在数据库里 当数据返回浏览器时浏览器解析数据发现还有一些静态资源如cssjs或者图片时又会发起另外的HTTP请求而这些请求可能会在CDN上那么CDN服务器又会处理这个用户的请求 以上具体流程如图所示 以上具体流程如图所示 不管网络架构如何变化但是始终有一些固定不变的原则需要遵守 互联网上所有资源都要用一个URL来表示。URL就是统一资源定位符 必须基于HTTP协议与服务端交互 数据展示必须在浏览器中进行 2 HTTP协议解析# B/S网络架构的核心是HTTP协议最重要的就是要熟悉HTTP协议中的HTTP HeaderHTTP Header控制着互联网上成千上万的用户的数据传输。最关键的是它控制着用户浏览器的渲染行为和服务器的执行逻辑。 常见的HTTP请求头 常见的HTTP请求头 常见的HTTP响应头 常见的HTTP响应头 常见的HTTP状态码 常见的HTTP状态码 2.1 浏览器缓存机制## 当我们使用CtrlF5组合键刷新一个页面时首先是在浏览器端会直接向目标URL发送请求而不会使用浏览器缓存的数据其次即使请求发送到服务端也有可能访问到的是缓存的数据。所以在HTTP的请求头中会增加一些请求头它告诉服务端我们要获取最新的数据而非缓存。最重要的是在请求Head中增加了两个请求项Pragma:no-cache和Cache-Control:no-cache。 Cache-Control/Pragma 这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令如果知道该页面是否为缓存不仅可以控制浏览器还可以控制和HTTP协议相关的缓存或代理服务器。 Cache-Control/Pragma字段的可选值 Cache-Control/Pragma字段的可选值 Cache-Control请求字段被各个浏览器支持的较好而且它的优先级也比较高它和其他一些请求字段如Expires同时出现时Cache-Control会覆盖其他字段。 Pragma字段的作用和Cache-Control有点类似它也是在HTTP头中包含一个特殊的指令使相关的服务器来遵守最常用的就是Pragma:no-cache它和Cache-Control:no-cache的作用是一样的。 Expires 缓存过期时间 Expires通常的使用格式是Expires:Sat,25 Feb 2012 12:22:17 GMT后面跟着一个日期和时间超过这个值后缓存的内容将失效也就是浏览器在发出请求之前检查这个页面的这个字段看该页面是否已经过期了过期了将重新向服务器发起请求。 Last-Modified/Etag 最后修改时间 Last-Modified字段一般用于表示一个服务器上的字段的最后修改时间资源可以是静态静态内容自动加上Last-Modified或者动态的内容如Servlet提供了一个getLastModified方法用于检查某个动态内容是否已经更新通过这个最后修改时间可以判断当前请求的资源是否是最新的。 一般服务器端在响应头中返回一个Last-Modified字段告诉浏览器这个页面的最后修改时间如Sat,25 Feb 2012 12:55:04 GMT浏览器再次请求时在请求头中增加一个If-Modified-Since:Sat,25 Feb 2012 12:55:04 GMT字段询问当前缓存的页面是否是最新的如果是最新的就会返回304状态码告诉浏览器是最新的服务器也不会传输新的数据。 与Last-Modified字段有类似功能的还有一个Etag字段这个字段的作用是让服务端给每个页面分配一个唯一编号然后通过这个编号来区分当前这个页面是否是最新的。这种方式比使用Last-Modified更加灵活但是在后端的Web服务器有多台时比较难处理因为每个Web服务器都要记住网站的所有资源编号否则浏览器返回这个编号就没有意义了。 3 WEB工作流程# 对于正常的上网过程系统其实是这样做的 浏览器本身是一个客户端当你输入URL的时候首先浏览器会去请求DNS服务器通过DNS获取相应的域名对应的IP然后通过IP地址找到IP对应的服务器后要求建立TCP连接等浏览器发送完HTTP Request请求包后服务器接收到请求包之后才开始处理请求包服务器调用自身服务返回HTTP Response响应包客户端收到来自服务器的响应后开始渲染这个Response包里的主体body等收到全部的内容随后断开与该服务器之间的TCP连接。 Web请求的工作原理 Web请求的工作原理可以简单地归纳为 浏览器通过DNS域名解析到服务器IP 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包如果请求的资源包含有动态语言的内容那么服务器会调用动态语言的解释引擎负责处理“动态内容”并将处理得到的数据返回给客户端 客户机与服务器断开。由客户端解释HTML文档在客户端屏幕上渲染图形结果 一个简单的HTTP事务就是这样实现的看起来很复杂原理其实是挺简单的。需要注意的是客户机与服务器之间的通信是非持久连接的也就是当服务器发送了应答后就与客户机断开连接等待下一次请求。 4 DNS域名解析# 4.1 DNS域名解析过程## 当用户在浏览器中输入域名如www.google.com并按下回车后DNS解析过程大体如下 DNS解析过程 浏览器缓存检查本机 浏览器会首先搜索浏览器自身的DNS缓存缓存时间比较短大概只有1分钟且只能容纳1000条缓存看自身的缓存中是否有www.google.com对应的条目而且没有过期如果有且没有过期则解析到此结束。 浏览器缓存域名也是有限制的不仅浏览器缓存大小有限制而且缓存的时间也有限制通常情况下为几分钟到几小时不等域名被缓存的时间限制可以通过TTL属性来设置。这个缓存时间太长和太短都不好如果缓存时间太长一旦域名被解析到的IP有变化会导致被客户端缓存的域名无法解析到变化后的IP地址以致该域名不能正常解析这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短会导致用户每次访问网站都要重新解析一次域名。 注我们怎么查看Chrome自身的缓存可以使用 chrome://net-internals/#dns 来进行查看 查看Chrome自身的DNS缓存 操作系统缓存检查本机hosts解析本机 如果浏览器自身的缓存里面没有找到对应的条目其实操作系统也会有一个域名解析的过程那么Chrome会首先搜索操作系统自身的DNS缓存中是否有这个域名对应的DNS解析结果如果找到且没有过期则停止搜索解析到此结束。 其次在Linux中可以通过/etc/hosts文件来设置你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址那么浏览器会首先使用这个IP地址。当解析到这个配置文件中的某个域名时操作系统会在缓存中缓存这个解析结果缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。 本地区域名服务器解析LDNS 如果在hosts文件中也没有找到对应的条目浏览器就会发起一个DNS的系统调用就会向本地配置的首选DNS服务器LDNS一般是电信运营商提供的也可以使用像Google提供的DNS服务器发起域名解析请求通过的是UDP协议向DNS的53端口发起请求这个请求是递归的请求也就是运营商的DNS服务器必须得提供给我们该域名的IP地址。 在我们的网络配置中都会有“DNS服务器地址”这一项这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办操作系统会把这个域名发送给这里设置的LDNS也就是本地区的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务例如你是在学校接入互联网那么你的DNS服务器肯定在你的学校如果你是在一个小区接入互联网的那这个DNS就是提供给你接入互联网的应用提供商即电信或者联通也就是通常所说的SPA那么这个DNS通常也会在你所在城市的某个角落通常不会很远。这个专门的域名解析服务器性能都会很好它们一般都会缓存域名解析结果当然缓存时间是受域名的失效时间控制的一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了所以LDNS主要承担了域名的解析工作。 运营商的DNS服务器首先查找自身的缓存找到对应的条目且没有过期则解析成功。 运营商的DNS服务器 根域名服务器解析Root Server 如果LDNS没有找到对应的条目则由运营商的DNS代我们的浏览器发起迭代DNS解析请求。它首先是会找根域的DNS的IP地址这个DNS服务器都内置13台根域的DNS的IP地址找到根域的DNS地址就会向其发起请求请问www.google.com这个域名的IP地址是多少啊。 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址gTLD是国际顶级域名服务器如.com、.cn、.org等全球只有13台左右。 根域发现这是一个顶级域com域的一个域名于是就告诉运营商的DNS我不知道这个域名的IP地址但是我知道com域的IP地址你去找它去。 本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。 于是运营商的DNS就得到了com域的IP地址又向com域的IP地址发起了请求请问www.google.com这个域名的IP地址是多少?com域这台服务器告诉运营商的DNS我不知道www.google.com这个域名的IP地址但是我知道google.com这个域的DNS地址你去找它去。 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址这个Name Server通常就是你注册的域名服务器例如你在某个域名服务提供商申请的域名那么这个域名解析任务就由这个域名提供商的服务器来完成。 于是运营商的DNS又向google.com这个域名的DNS地址这个一般就是由域名注册商提供的像万网新网等发起请求请问www.google.com这个域名的IP地址是多少这个时候google.com域的DNS服务器一查果真在我这里于是就把找到的结果发送给运营商的DNS服务器这个时候运营商的DNS服务器就拿到了www.google.com这个域名对应的IP地址。 Name Server域名服务器会查询存储的域名和IP的映射关系表正常情况下都根据域名得到目标IP记录连同一个TTL值返回给DNS Server域名服务器。 返回该域名对应的IP和TTL值Local DNS Server会缓存这个域名和IP的对应关系缓存的时间由TTL值控制。 把解析的结果返回给用户用户根据TTL值缓存在本地系统缓存中域名解析过程结束。 通过上面的步骤我们最后获取的是IP地址也就是浏览器最后发起请求的时候是基于IP来和服务器做信息交互的。在实际的DNS解析过程中可能还不止这10个步骤如Name Server也可能有多级或者有一个GTM来负载均衡控制这都有可能会影响域名解析的过程。根据以上解析流程DNS解析整个过程分为递归查询过程和迭代查询过程。如图所示 DNS解析整个过程 所谓 递归查询过程 就是 “查询的递交者” 更替, 而 迭代查询过程 则是 “查询的递交者”不变。 举个例子来说你想知道某个一起上法律课的女孩的电话并且你偷偷拍了她的照片回到寝室告诉一个很仗义的哥们儿这个哥们儿二话没说拍着胸脯告诉你甭急我替你查(此处完成了一次递归查询即问询者的角色更替)。然后他拿着照片问了学院大四学长学长告诉他这姑娘是xx系的然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学助理同学说是xx系yy班的然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话。(此处完成若干次迭代查询即问询者角色不变但反复更替问询对象)最后他把号码交到了你手里。完成整个查询过程。 4.2 跟踪域名解析过程## 在Linux系统中还可以使用dig命名来查询DNS的解析过程如下所示dig cmd trace www.google.com 使用dig命名来查询DNS的解析过程 上面清楚地显示了整个域名是如何发起和解析的从根域名()到gTLD Server(.com.)再到Name Server (google.com.)的整个过程都显示出来了。还可以看出DNS的服务器有多个备份可以从任何一台查询到解析结果。 4.3 清除缓存的域名## 我们知道DNS域名解析后会缓存解析结果其中主要在两个地方缓存结果一个是Local DNS Server另外一个是用户的本地机器。这两个缓存都是TTL值和本机缓存大小控制的但是最大缓存时间是TTL值基本上Local DNS Server的缓存时间就是TTL控制的很难人工介入但是我们的本机缓存可以通过如下方式清除。 在Linux下可以通过/etc/init.d/nscd restart来清除DNS缓存。如下 在Linux下清除DNS缓存 JVM缓存DNS解析结果 在Java应用中JVM也会缓存DNS的解析结果这个缓存是在InetAddress类中完成的而且这个缓存时间还比较特殊它有两种缓存策略一种是正确解析结果缓存另一种是失败的解析结果缓存。这两个缓存时间由两个配置项控制配置项是在%JAVA_ HOME%\lib\security\java.security文件中配置的。两个配置项分别是networkaddress.cache.ttl 和networkaddress.cache.negative.ttl它们的默认值分别是-1永不失效和10缓存10秒。 要修改这两个值同样有几种方式分别是直接修改java.security文件中的默认值、在Java的启动参数中增加-Dsun.net.inetaddr.ttlxxx来修改默认值、通过InetAddress类动态修改。 在这里还要特别强调一下如果我们需要用InetAddress类解析域名时一定要是单例模式不然会有严重的性能问题如果每次都创建InetAddress实例每次都要进行一次完整的域名解析非常耗时这点要特别注意。 4.4 几种域名解析方式## A记录A代表的是Address用来指定域名对应的IP地址 如将item.taobao.com指定到115.238.23.241将switch.taobao.com指定到121.14.24.241。A记录可以将多个域名解析到一个IP地址但是不能将一个域名解析到多个IP地址。 MX记录表示的是Mail Exchange就是可以将某个域名下的邮件服务器指向自己的Mail Server 如taobao.com域名的A记录IP地址是115.238.25.245如果MX记录设置为115.238.25.246是xxxtaobao.com的邮件路由DNS会将邮件发送到115.238.25.246所在的服务器而正常通过Web请求的话仍然解析到A记录的IP地址。 CNAME记录全称是Canonical Name别名解析所谓的别名解析就是可以为一个域名设置一个或者多个别名 如将taobao.com解析到xulingbo.net将srcfan.com也解析到xulingbo.net其中xulingbo.net分别是taobao.com和srcfan.com的别名。前面的跟踪域名解析中的“www.taobao.com. 1542 IN CNAME www.gslb.taobao.com”就是CNAME解析。 NS记录为某个域名指定DNS解析服务器也就是这个域名有指定的IP地址的DNS服务器去解析 前面的“google.com. 172800 IN NS ns4.google.com.”就是NS解析。 TXT记录为某个主机名或域名设置说明 如可以为google.com设置TXT记录为“谷歌|中国”这样的说明。 4.5 网络抓包分析## Linux虚拟机测试使用命令 wget www.linux178.com 来请求发现直接使用chrome浏览器请求时干扰请求比较多所以就使用wget命令来请求不过使用wget命令只能把index.html请求回来并不会对index.html中包含的静态资源js、css等文件进行请求。 抓包截图如下 抓包截图 1号包这个是那台虚拟机在广播要获取192.168.100.254也就是网关的MAC地址因为局域网的通信靠的是MAC地址它为什么需要跟网关进行通信是因为我们的DNS服务器IP是外围IP要出去必须要依靠网关帮我们出去才行。 2号包这个是网关收到了虚拟机的广播之后回应给虚拟机的回应告诉虚拟机自己的MAC地址于是客户端找到了路由出口。 3号包这个包是wget命令向系统配置的DNS服务器提出域名解析请求准确的说应该是wget发起了一个DNS解析的系统调用请求的域名www.linux178.com期望得到的是IP6的地址AAAA代表的是IPv6地址。 4号包这个DNS服务器给系统的响应很显然目前使用IPv6的还是极少数所以得不到AAAA记录的。 56号包这个还是请求解析IPv6地址但是www.linux178.com.leo.com这个主机名是不存在的所以得到结果就是no such name。 7号包这个才是请求的域名对应的IPv4地址A记录。 8号包DNS服务器不管是从缓存里面还是进行迭代查询最终得到了域名的IP地址响应给了系统系统再给了wget命令wget于是得到了www.linux178.com的IP地址这里也可以看出客户端和本地的DNS服务器是递归的查询也就是服务器必须给客户端一个结果这就可以开始下一步了进行TCP的三次握手。 5 发起TCP的3次握手# 拿到域名对应的IP地址之后User-Agent一般是指浏览器会以一个随机端口1024 端口 65535向服务器的WEB程序常用的有httpd,nginx等80端口发起TCP的连接请求。这个连接请求原始的http请求经过TCP/IP4层模型的层层封包到达服务器端后这中间通过各种路由设备局域网内除外进入到网卡然后是进入到内核的TCP/IP协议栈用于识别该连接请求解封包一层一层的剥开还有可能要经过Netfilter防火墙属于内核的模块的过滤最终到达WEB程序最终建立了TCP/IP的连接。 如下图所示 03174517_saG0.png Client首先发送一个连接试探ACK0 表示确认号无效SYN 1 表示这是一个连接请求或连接接受报文同时表示这个数据报不能携带数据seq x 表示Client自己的初始序号seq 0 就代表这是第0号包这时候Client进入syn_sent状态表示客户端等待服务器的回复。 Server监听到连接请求报文后如同意建立连接则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ack x 1表示期望收到对方下一个报文段的第一个数据字节序号是x1同时表明x为止的所有数据都已正确收到ack1其实是ack01,也就是期望客户端的第1个包seq y 表示Server自己的初始序号seq0就代表这是服务器这边发出的第0号包。这时服务器进入syn_rcvd表示服务器已经收到Client的连接请求等待client的确认。 Client收到确认后还需再次发送确认同时携带要发送给Server的数据。ACK 置1 表示确认号ack y 1 有效代表期望收到服务器的第1个包Client自己的序号seq x 1表示这就是我的第1个包相对于第0个包来说的一旦收到Client的确认之后这个TCP连接就进入Established状态就可以发起http请求了。 看抓包截图 抓包截图 TCP 为什么需要3次握手 举个例子假设一个老外在故宫里面迷路了看到了小明于是就有下面的对话 老外 Excuse meCan you Speak English? 小明 yes 。 老外 OK,I want ... 在问路之前老外先问小明是否会说英语小明回答是的这时老外才开始问路。 2个计算机通信是靠协议目前流行的TCP/IP协议来实现,如果2个计算机使用的协议不一样那是不能进行通信的所以这个3次握手就相当于试探一下对方是否遵循TCP/IP协议协商完成后就可以进行通信了当然这样理解不是那么准确。 为什么HTTP协议要基于TCP来实现 目前在Internet中所有的传输都是通过TCP/IP进行的HTTP协议作为TCP/IP模型中应用层的协议也不例外TCP是一个端到端的可靠的面向连接的协议所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。 6 建立TCP连接后发起http请求# 经过TCP3次握手之后浏览器发起了http的请求看第⑫包使用的http的方法 GET 方法请求的URL是 / ,协议是HTTP/1.0 03175340_4j8z.png 下面是第12号包的详细内容 03175429_kHoP.png 以上的报文是HTTP请求报文。那么HTTP请求报文和响应报文会是什么格式呢 起始行如 GET / HTTP/1.0 请求的方法 请求的URL 请求所使用的协议 头部信息User-Agent Host等成对出现的值 主体 不管是请求报文还是响应报文都会遵循以上的格式。那么起始行中的请求方法有哪些种呢 GET: 完整请求一个资源 常用 HEAD: 仅请求响应首部 POST: 提交表单 常用 PUT: 上传 DELETE: 删除 OPTIONS: 返回请求的资源所支持的方法的方法 TRACE: 追求一个资源请求中间所经过的代理 那什么是URL、URI、URN URI Uniform Resource Identifier 统一资源标识符如scheme://[username:password]HOST:port/path/to/source URL Uniform Resource Locator 统一资源定位符如http://www.magedu.com/downloads/nginx-1.5.tar.gz URN Uniform Resource Name 统一资源名称 URL和URN都属于URI为了方便就把URL和URI暂时都通指一个东西。 请求的协议有哪些种有以下几种 http/0.9: stateless http/1.0: MIME, keep-alive (保持连接), 缓存 http/1.1: 更多的请求方法更精细的缓存控制持久连接(persistent connection) 比较常用 下面是Chrome发起的http请求报文头部信息 03181252_cIE1.png Accept 就是告诉服务器端接受那些MIME类型 Accept-Encoding 这个看起来是接受那些压缩方式的文件 Accept-Lanague 告诉服务器能够发送哪些语言 Connection 告诉服务器支持keep-alive特性TCP连接在发送后将仍然保持打开状态于是浏览器可以继续通过相同的TCP连接发送请求。保持连接节省了为每个请求建立新连接所需的时间还节约了网络带宽。 Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端 Host 用来标识请求服务器上的那个虚拟主机比如Nginx里面可以定义很多个虚拟主机那这里就是用来标识要访问那个虚拟主机。 User-Agent 用户代理一般情况是浏览器也有其他类型如wget curl 搜索引擎的蜘蛛等 条件请求头部If-Modified-Since是浏览器向服务器端询问某个资源文件如果自从什么时间修改过那么重新发给我这样就保证服务器端资源文件更新时浏览器再次去请求而不是使用缓存中的文件。 安全请求头部Authorization: 客户端提供给服务器的认证信息 什么是MIME MIMEMultipurpose Internet Mail Extesions 多用途互联网邮件扩展是一个互联网标准它扩展了电子邮件标准使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此一些非英语字符消息和二进制文件图像声音等非文字消息都不能在电子邮件中传输。 MIME规定了用于表示各种各样的数据类型的符号化方法。此外在万维网中使用的HTTP协议中也使用了MIME的框架标准被扩展为互联网媒体类型。 MIME 遵循以下格式major/minor 主类型/次类型 例如 image/jpg image/gif text/html video/quicktime appliation/x-httpd-php 转自https://www.jianshu.com/p/558455228c43
http://www.zqtcl.cn/news/498644/

相关文章:

  • 驾校网上约车网站开发不会做网站如何做seo
  • 企业做推广可以发哪些网站宜兴埠网站建设
  • 网站后台文章添加成功 不显示公司设计网站建设合同
  • 后端开发需要掌握哪些知识潍坊优化公司
  • 专业手机网站制作哪家好wordpress wp-polls
  • 网站建设前分析网页制作素材按钮
  • 做视频网站怎么对接云盘松江新城网站建设
  • 温州阿里巴巴网站建设企业宣传片怎么拍
  • 淮阳住房城乡建设局网站阿里巴巴做国际网站要多少钱
  • 电子商务个人网站可以备案吗短网址还原
  • 网站内容由什么组成部分组成部分电子商务网站建设主管的策划书
  • 云服务器安装win系统做网站seo三人行论坛
  • 电气网站设计机械设计软件solidworks
  • 内网网站建设所需硬件设备厦门关键词排名提升
  • 网站动态海报效果怎么做的最专业网站建
  • 学校如何建设网站北京市住房及城乡建设部网站
  • 响应式网站制作流程全国城建培训中心官网查询证书
  • 北京工程建设信息网站中国市场网
  • xml做网站源码免费网站是
  • 中国工商建设标准化协会网站织梦app网站模板
  • 怎么做好网络销售文大侠seo博客
  • wish网站应该怎么做网站建设前规划
  • 网站建设目的是什么建筑机械人才培训网官网
  • 建筑建设行业网站大型购物网站开发
  • 手机网站开发用什么设计之家网
  • 网站开发平台有哪些什么是网络开发
  • 学校网站前置审批网站做哪些比较有意思
  • 怎么给企业做网站学计算机网站建设
  • 网站关键词优化排名技巧aiyuan wordpress
  • 建设工程资质证书二维码扫描网站自己做的网站如何让qq登录