amenzai / myDiary

Record what you do every day
4 stars 0 forks source link

HTTP协议笔记 #54

Closed amenzai closed 6 years ago

amenzai commented 6 years ago

http基础 20180815112941 20180815113006

url 20180815113023

http 客户端

CORS跨域请求的限制与解决

简单请求:

凡是不同时满足上面两个条件,就属于非简单请求。一句话,简单请求就是简单的 HTTP 方法与简单的 HTTP 头信息的结合。

cors 的 http 响应:

Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

(1)Access-Control-Allow-Origin

该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

(2)Access-Control-Allow-Credentials

该字段可选。它的值是一个布尔值,表示是否允许发送 Cookie。默认情况下,Cookie 不包括在 CORS 请求之中。设为true,即表示服务器明确许可,浏览器可以把 Cookie 包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送 Cookie,不发送该字段即可。

(3)Access-Control-Expose-Headers

该字段可选。CORS 请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个服务器返回的基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

非简单请求:

非简单请求是那种对服务器提出特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

非简单请求的 CORS 请求,会在正式通信之前,增加一次 HTTP 查询请求,称为“预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。这是为了防止这些新增的请求,对传统的没有 CORS 支持的服务器形成压力,给服务器一个提前拒绝的机会,这样可以防止服务器大量收到DELETE和PUT请求,这些传统的表单不可能跨域发出的请求。

Cache-Control

Last-Modified

20180815113037

Etag

Cookie

HTTP 长连接

数据协商

跳转 Redirect

参考代码

content-security-policy

限制资源获取

Nginx

下载地址:http://nginx.org/en/download.html

Nginx代理配置和代理缓存

安装目录下的conf>nginx.conf文件:

# 自定义配置文件
# nginx.conf 中添加此内容
include          servers/*.conf;

# test.conf文件内容如下:
proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m; # 代理缓存配置
# server {
#   listen       80;
#   server_name  test.com; # 代理 test.com 到 http://127.0.0.1:8888
#   location / {
#     proxy_cache       my_cache; # 设置代理缓存,如果设置了浏览器缓存,那么代理也会实施缓存,那么使用其他浏览器访问,就会从代理缓存取数据(或者其他用户进行访问)
#     proxy_pass        http://127.0.0.1:8888;
#     proxy_set_header  Host $host; # 代理头 设置host为test.com
#   }
# }

server {
  listen       80 default_server; # 自动跳转 https
  listen       [::]:80 default_server;
  server_name  test.com;
  return 302 https://$server_name$request_uri;
}

server {
  # listen       443; # 配置https
  listen       443 http2; # 配置http2
  server_name  test.com;
  http2_push_preload on; # http2配置 服务端推送

  ssl on;
  ssl_certificate_key ../certs/localhost-privkey.pem; # 那个命令生成的两个文件的地址
  ssl_certificate ../certs/localhost-cert.pem;

  location / {
    proxy_cache       my_cache;
    proxy_pass        http://127.0.0.1:8888;
    proxy_set_header  Host $host;
  }
}

代理服务器可以很容易修改http请求的请求和响应内容,因为 http 请求是明文传输,可以解析得到,https 是不可以的,因为 https 进行了加密

HTTPS解析

20180815113052

Nginx部署HTTPS

本地生成 公钥私钥

# git bash 执行命令 生成两个文件
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pem

http2

浏览器并发 TCP连接数 限制

ALPN nginx 兼容处理 http2:

# 测试
curl -v -k https://test.com
curl -v -k --http1.1 https://test.com # 使用http1.1