代理作为 HTTP 客户端和网络服务器之间的中间连接点,可提高互联网连接的安全性和隐私性。要支持在防火墙后面运行 Android Studio,就要为 Android Studio IDE 设置代理设置。使用 Android Studio IDE HTTP 代理设置页面可为 Android Studio 设置 HTTP 代理设置;若从命令行或在未安装 Android Studio 的计算机上运行 Android Plugin for Gradle,就要在 Gradle 编译文件中设置代理设置。
insert(index, item) 方法用于将元素 item 插入列表的指定位置,示例如下:>>> x = ['www', 'com']>>> x.insert(1, 'imooc')>>> x['www', 'imooc', 'com']>>> x.insert(0, 'http')>>> x['http', 'www', 'imooc', 'com']>>> x.insert(4, 'end')>>> x['http', 'www', 'imooc', 'com', 'end']在第 2 行,将元素 ‘imooc’ 插入到列表的位置为 1 的地方在第 5 行,将元素 ‘http’ 插入到列表的位置为 0 的地方,即插入到队列的首部在第 8 行,将元素 ‘end’ 插入到列表的位置为 4 的地方,即插入到队列的尾部
Android Studio 支持 HTTP 代理设置,因此我们可以在防火墙后面或使用安全网络运行 Android Studio。要在 Android Studio 中设置 HTTP 代理设置,请执行以下操作:在菜单栏中,依次点击 File > Settings(在 macOS 上,依次点击 Android Studio > Preferences)。在左侧窗格中,依次点击 Appearance & Behavior > System Settings > HTTP Proxy。此时将显示 HTTP Proxy 页面。选择 Auto-detect proxy settings 以使用自动代理配置网址来配置代理设置,或选择 Manual proxy configuration 以自行输入每一项设置。有关这些设置的详细说明,请参阅 HTTP 代理。点击 OK 以保存所做的更改。
在上面配置文件的基础上,我们增加一个 server 指令块,监听 9000 端口,匹配 url 请求,转发到 web1.html 和 web2.html 页面,具体配置如下: ... server { listen 9000; location /web1 { proxy_pass http://localhost:8081/web/web1.html; } location /web2 { proxy_pass http://localhost:8081/web/web2.html; } } ...这样,当我们访问 url 地址 http://服务器ip:9000/web1 时,会将请求转发到 http://localhost:8081/web/web1.html ,而这个如果是在服务器上执行会根据前面的配置访问静态资源web1.html。 同样,对于访问 web2.html 页面,我们只需要请求 http://服务器ip:9000/web2 即可。测试结果通过方向代理访问 web1.html通过方向代理访问 web2.html
例如给出如下 nginx 的访问日志,需要对其进行分析并且输出不同的状态码,利用颜色不同进行区分不同的状态码。112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1" 200 5276 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1" 200 12674 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1" 404 260490 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) Apessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:54 +0800] "GET /js/app.ec4e6290.js HTTP/1.1" 200 11149 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1" 200 260482 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /api/2 HTTP/1.1" 500 502 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1" 200 5276 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /css/chunk-91d36e6e.a5cb4df4.css HTTP/1.1" 200 1133 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-03341f87.78501520.js HTTP/1.1" 200 1059 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1" 200 12674 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:56 +0800] "GET /api/1 HTTP/1.1" 500 39193 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:56 +0800] "GET /img/download.f4b65200.png HTTP/1.1" 200 7737 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /img/background.fc2d80f1.png HTTP/1.1" 200 57711 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /img/peitu.a89ef99f.svg HTTP/1.1" 301 106569 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /fonts/element-icons.535877f5.woff HTTP/1.1" 200 28200 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/download.f4b65200.png HTTP/1.1" 200 7737 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/scan.d3d981fc.png HTTP/1.1" 404 39193 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/background.fc2d80f1.png HTTP/1.1" 200 57711 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:11:00 +0800] "GET /img/peitu.a89ef99f.svg HTTP/1.1" 200 106569 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /index HTTP/1.1" 200 535 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /css/app.7d918353.css HTTP/1.1" 200 1290 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /js/app.ec4e6290.js HTTP/1.1" 404 11149 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"
这边的代码虽然很简单,但是最核心的 Http 服务雏形已经展示出来了,成熟的 Http 服务可以在这基础上对以下模块进行优化:针对请求事件的 线程 / IO 优化;Servlet 协议支持;配置独立管理;Http协议内容完善(比如缓存机制);支持虚拟主机配置;支持代理;rewrite 机制;安全认证。
官方定义:Requests is the only Non-GMO HTTP library for Python, safe for human consumption.简单翻译一下就是:Requests 是唯一适用于 Python 的 Non-GMO HTTP 库,可供开发人员安全使用。上面是 requests 库的官方定义。简单来说 requests 库是 Python 的第三方 HTTP 库,以 urllib 为基础。因为使用简单,人性化,安全的特性,被广泛的用来爬虫的请求发送。
本文来学习一下如何进行 Go 语言的性能测试。这里需要学习一个 Go 语言官方提供的工具 pprof:runtime/pprof:采集程序(非 Server)的运行数据进行分析;net/http/pprof:采集 HTTP Server 的运行时数据进行分析。上述两个包的底层实现是一样的,一般建议直接在主函数上加上 http 服务而使用第二个包,毕竟可视化显示易于观察和操作。故本文仅介绍 net/http/pprof 的用法。
在浏览器中访问 http://localhost:5000/user,显示如下:
要求进行代理身份验证,类似于401,表示客户必须先经过代理服务器的授权。代理服务器返回需要认证的状态HTTP/1.1 407 Proxy Authentication RequiredProxy-Authenticate: Basic; realm="Secured area"客户端发起代理认证GET / HTTP/1.1Proxy-Authorization: Basic d2VsbCBkb25lOllvdSBmb3VuZCB0aGUgc2Vjb25kIGVhc3RlciBlZ2cK原站需要认证,代理服务器也需要认证的情况GET / HTTP/1.1Proxy-Authorization: Basic ZWFzdGVyIGVnZzpudW1iZXIgdGhyZWUKAuthorization: Bearer c2VuZCBtZSBhIHR3ZWV0IG9yIHNvbWV0aGluZwo
在浏览器中,访问 http://localhost:5000/news/society/, 显示如下:
requests 是一个的简单易用的 http 库,发出 http 请求并获取响应,可以用于抓取网站的页面。使用 requests.get(url) 方法抓取 baidu 的首页,示例如下:>>> import requests>>> response = requests.get('https://www.baidu.com')>>> response.text'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>...在第 2 行,使用 requests.get(‘https://www.baidu.com’) 获取 baidu 首页在第 3 行,response.text 是 baidu 首页 html 文件的内容
首先在 application.properties 中指定配置文件的位置。实例:spring.cache.jcache.config=classpath:ehcache.xmlspring.cache.type=jcache然后在 resource 文件夹中添加 ehcache.xml 配置文件,内容如下:实例:<?xml version="1.0" encoding="UTF-8"?><config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.ehcache.org/v3' xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> <!-- 持久化路径 --> <persistence directory="C://ehcache" /> <!--缓存模板 --> <cache-template name="CacheTemplate"> <expiry> <!--存活时间 --> <tti>60</tti> </expiry> <resources> <!--堆空间 --> <heap unit="entries">2000</heap> <!-- 堆外空间 --> <offheap unit="MB">500</offheap> </resources> </cache-template> <!--缓存对象 --> <cache alias="GoodsCache" uses-template="CacheTemplate"> </cache></config>Tips:Ehcache 的配置比较复杂,此处只是给出简单的示例,感兴趣的同学可以查阅更多资料。
Websocket 是一种升级版的 Http 服务,传统的 Http 服务都是客户端发起,服务端响应,而 Websocket 支持服务端向客户端主动推送消息,增强了浏览器的交互场景。Websocket 也是应用层协议,跟 Http 一样具体的实现都要基于 Socket,除此之外并没有什么特殊。
例如前面的默认 Nginx.conf 示例中,下面一行就是一个指令:worker_processes 1;而使用花括号包围起来的就是一个指令块,比如 http 指令块:http { # 继续指令或者指令块,如http指令块可以包括server指令块 ...}对于具体指令的参数、含义以及指令可以放入的指令块等信息都可以在官方查到;
server { server_name location.test.com; listen 8010; location = / { return 200 "精确匹配/"; } location ~* /ma.*ch { return 200 "正则匹配/ma.*ch"; } location ~ /mat.*ch { return 200 "正则匹配/match.*"; } location = /test { return 200 "精确匹配/test"; } location ^~ /test/ { return 200 "前缀匹配/test"; } location ~ /test/he*o { return 200 "正则匹配/test/he*o"; } location / { return 200 "通配/"; }}我们按照这样的 location 规则,进行匹配实验,结果如下:# 精确匹配优先级最高$ curl http://localhost:8010/精确匹配/$ curl http://localhost:8010/test 精确匹配/test# 前缀匹配优先级高于正则匹配$ curl http://180.76.152.113:8010/test/heeo 前缀匹配/test# 正则匹配,按照顺序依次匹配,如果同时匹配两个正则,则前面的优先匹配$ curl http://180.76.152.113:8010/matxxch 正则匹配/ma.*ch# 什么都匹配不到时,最后匹配通配/$ curl http://180.76.152.113:8010/xxxxx 通配/
在 Go 语言中想要搭建一个 http 服务是非常容易的一件事情,一行代码就可以了。代码示例:package mainimport ( "net/http")func main() { http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口}运行以上代码可以得到一个服务,在浏览器上输入http://127.0.0.1:9300/,由于没有编写任何路由,所以只会出现 404 的提示:
接下来,注释 ip_hash 指令,我们打开 hash user_$arg_username 这行配置的注释, hash 指令可以让我们根据我们设置的 key 进行 hash,然后根据 hash 值选择上游的服务器。具体测试参看下面的 Linux 命令:[shen@shen ~]$ curl http://180.76.152.113?username=shen8001, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server这里我们可以看到,在请求中带上 username 参数,Nginx 中配置的 hash 算法会根据请求中带的 username 参数作为 key 去进行 hash,然后在根据 hash 结果映射上游服务器。username 相同时,选择的上游服务器肯定是一样的,只有在 username 的值发生变化时,返回的响应才可能有变化。
通过设置 HTTP 的 Set-Cookie 消息头,Web 服务器将 Cookie 发送给浏览器。Set-Cookie 消息的格式如下面所示,括号中的部分都是可选的:Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]消息头的第一部分,value 部分,通常是一个 name=value 格式的字符串。服务端向客户端发送的 HTTP 响应中设置 HTTP 的 Set-Cookie 消息头,一个具体的例子如下:Connection:keep-aliveContent-Type:text/plainDate:Fri, 14 Jul 2017 10:49:23 GMTSet-Cookie:user=ZhangSanTransfer-Encoding:chunked在这个例子中,服务端向客户端发送的 HTTP 消息头中,设置了 ‘Set-Cookie:user=ZhangSan’,客户端浏览器将接受到字符串 ‘user=ZhangSan’ 作为 Cookie,下次访问网站时,浏览器会将该 Cookie 发送给服务端。
客户端收到服务端的 Cookie 后,该 Cookie 会在接下来的每个请求中被发送至服务器。Cookie 的值被存储在名为 Cookie 的 HTTP 消息头中,并且只包含了 Cookie 的值,其它的选项全部被去除。客户端向服务端发送的 HTTP 请求中设置 Cookie 消息头,一个具体的例子如下:Connection:keep-aliveCookie:user=ZhangSanHost:localhost:8080User-Agent:Mozilla/5.0 AppleWebKit/537.36 Chrome Safari在这个例子中,客户端向服务端发送的 HTTP 消息头中,设置了 ‘Cookie:user=ZhangSan’,服务端接受到字符串 ‘user=ZhangSan’ 作为 Cookie,从而确认此次请求对应的用户。
本节讨论了如何利用 HTTP 请求头提升 Spring Security Web 项目的安全性,主要内容有:Http 安全响应头是提升 B/S 应用安全性的有效手段;Spring Security 默认实现了常用的安全响应头;Spring Security 可以通过配置类,直接开启、关闭或调整各个内置请求头的状态及参数;Spring Security 提供了静态设置响应头的方法;Spring Security 支持动态添加响应头;Spring Security 支持针对某个特殊请求动态设置响应头。下节我们讨论针对 HTTP 协议,我们还能有哪些安全性提升策略。
启动项目,访问 http://127.0.0.1:8080/goods 返回数据如下:实例:{"code":0,"msg":"操作成功","data":[]}然后访问 http://127.0.0.1:8080/test ,返回数据如下:实例:{"code":99999,"msg":"/ by zero","data":null}这样,前端可以根据返回值的 code, 来判断后端是否正常响应。如果 code 为 0 ,则进行正常业务逻辑操作;如果 code 非 0 ,则可以弹窗显示 msg 提示信息。
由于每个页面都在 ViewPager 中,所以整体的布局非常简单,我们只需要放置一个 ViewPager 以及一个 TextView 用来显示当前 Page 的标题即可。<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:showIn="@layout/activity_main"> <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> <TextView android:text="Num" android:textSize="100sp" android:id="@+id/text" android:layout_marginTop="50dp" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>
优化搜索引擎定义页面使用语言控制页面缓存网页定义评价控制页面显示窗口……例如<meta name="keywords" content="HTML,PHP,SQL"> <!-- 定义文档关键词,用于爬虫搜索引擎 --><meta http-equiv="charset" content="iso-8859-1"> <!-- 定义文档的字符集 --><meta http-equiv="expires" content="31 Dec 2020"> <!-- 定义文档的缓存过期时间 -->
Http 并不单单应用在 Web 网站中,桌面软件/移动应用这些客户端要想与服务器交互数据,也同样可以借助 Http 协议。它是一种轻量级,跨语言,使用范围很广的传输协议。
启动项目,打开浏览器访问 http://127.0.0.1:8080/goods ,即可查看输出结果。
先来看一个我们经常见到的 URL 形式:http://www.imooc.com/wiki/html5上面这个 URL 由以下几部分组成:scheme://host:port/path?key=valuescheme:代表的是访问的协议,一般为 http 或者 https。例如,https://www.baidu.com 的协议是 https;host:主机名、域名,例如,https://www.baidu.com 的 host 为 www.baidu.com;port:端口号,http 协议默认使用 80 端口,https 协议默认使用 443 端口。通常情况下,使用默认值,不需要显式的写明端口号,例如,https://www.baidu.com 的端口是 443。某些情况下,可以显式的写明端口号,例如,http://localhost:5000 的端口号是 5000;path:页面路径,例如:http://www.imooc.com/wiki/html5 的 path 是 wiki/html5;key=value:查询字符串,例如:https://www.baidu.com/s?wd=python,查询字符串是 wd=python,查询字符串包括两部分:参数名和参数值,这个例子中,参数名是 wd,参数值是 python。
最重要的 CONTENT 是处理 Http 请求内容的阶段,大部分 HTTP 模块介入这个阶段,比如 index、autoindex、concat 以及反向代理的模块都是在这里生效的。
content 阶段中最主要的 static 模块,该模块提供了root 和 alias 这两个常用的指令。二者的用法如下:Syntax: alias pathDefault: —Context: locationSyntax: root pathDefault: root htmlContext: http, server, location, if in location可以看到,单从指令用法上就可以看到不少区别,首先是 alias 指令没有默认值,而且该指令只能在 location 中使用。而 root 可以存在与 http、server、location 等多个指令块中,还可以出现在 if 指令中。另外,最最主要的不同是两个指令会以不同的方式将请求映射到服务器文件上。root 指令会用[root 路径 + location 路径]的规则映射静态资源请求,而 alias 会使用 alias 的路径替换 location 路径。此外 alias 后面必须要用“/”结束,否则会找不到文件的,而 root 则可有可无。来看下面一个例子:location ^~ /test { root /root/html/;}location ^~ /test2/ { alias /root/html/;}对于 http 请求: http://ip:端口/test/web1.html访问的是主机 上全路径为 /root/html/test/web1.html的静态资源;而请求http://ip:端口/test2/web1.html 访问的是全路径为/root/html/web1.html的静态资源,/test2/已经被替换掉了。在 static 模块中,还提供了 3 个变量供我们使用,分别是:request_filename: 访问静态资源的完整路径document_root: 访问静态资源文件所在目录realpath_root: 如果 document_root 是软链接,则改变量会将其替换成真正的地址同样是上面的例子,稍做改动: location /web { default_type text/html; alias /root/test/web; return 200 '$request_filename:$document_root:$realpath_root\n'; }访问 http://ip:端口//web/web1.html, 返回的结果为:/root/test/web/web1.html:/root/test/web:/root/test/web在 content 阶段,在 static 模块之前,还会执行的模块有 index 和 autoindex模块。index 模块提供了 index 指令,用于指定/访问时返回 index 文件内容。autoindex 模块会根据配置决定是否以列表的形式展示目录下的内容,这个功能在后续实战中搭建内部 pip 源中会用到。Syntax: index file ...;Default: index index.html;Context: http, server, location# 示例,访问 uri=/ 时,返回静态资源 index.html 文件中的内容location / { index index.html;}# 是否开启目录显示,默认Nginx是不会显示目录下的所有文件Syntax: autoindex on | off;Default: autoindex off;Context: http, server, location# 显示出文件的实际大小Syntax: autoindex_exact_size on | off;Default: autoindex_exact_size on;Context: http, server, location# 显示格式,默认是html形式显示Syntax: autoindex_format html | xml | json | jsonp;Default: autoindex_format html;Context: http, server, location# 显示时间,设置为on后,按照服务器的时钟为准Syntax: autoindex_localtime on | off;Default: autoindex_localtime off;Context: http, server, location
客户端已经是在代理模式,服务端可能出于安全因素,提示客户端需要切换一个新的代理。306 在新的规范中已经不在使用,该编码保留。HTTP/1.1 306 Switch ProxySet-Proxy: SET; proxyURI="https://proxy.imooc.com:8080/" scope="http://", seconds=100