• http 知识整理


    1. 启发式缓存

    在不设置cache-control/expires的情况下,浏览器不会默认进入协商缓存。而是根据Date/LastModified去自动计算出合适的缓存时间。
    计算方式为:(Date - LastModified) * n
    n:LM-Factor,处于[0,1]之间

    2. 强制缓存 ---- 再次请求时无需向浏览器发送请求。

    Cache-control: 具有强大的缓存控制能力;
    常用值:no-cache: 每次请求需要校验服务器资源的新鲜度
    max-age=31536000: 浏览器在一年内都不需要像服务器请求资源。
    Expires: 使用绝对时间。

    3. 协商缓存 ---- 再次请求时需要向服务器校验新鲜度。若新鲜,返回304,从浏览器获取。

    Last-Modified/If-Modified-Since: 匹配响应头的Last-Modified与请求头的If-Modified-Since是否一致。
    Etag/If-None-Match: 匹配响应头中的Etag与请求头中的If-None-Match是否一致。

    4. Last-Modified 局限性

    a. 时间精度只有秒级别,但某文件在一秒内可以被更改n次。
    b. 某一文件经过修改后但内容并未发生改变。(比如添加一行再删除一行)

    5. Etag — Last-Modified的‘补丁’,精度更高。

    针对文件内容进行hash计算,得到的hash值作为Etag的值。

    6. 图片防盗链

    a. Referer: 标识网页来源地址。
    原理:通过判断referer来验证访问是否合法,不合法则返回403,禁止访问图片。
    b. 给图片添加水印。

    7. 防止图片防盗链

    不发referer请求头,两种方式:
    a. 直接浏览器输入url,自动不会携带referer。
    b.Referrer-Policy设置不发送Referer请求头: Referrer-Policy: no-referrer

    8. User-Agent

    标识客户端,简称UA.
    通过该头可获取到所用浏览器、浏览器版本、操作系统等信息。

    9. 浏览器如何判断PC/Mobile

    推荐库:https://github.com/kaimallea/isMobile

    10. 项目缓存策略

    对带有hash值的文件资源设置一年强缓存;(当源文件内容发生变更时,hash值发生改变,生成新的可永久缓存的资源地址,此时打包会遍历文件,更新缓存地址并清除掉旧缓存)。
    对不带hash值得文件资源一定要显式的配置****Cache-Control: no-cache
    如果不配置,就会触发启发式缓存,从而造成应用升级但是刷新不生效的问题。
    tips: 不设置强缓存的时候,默认进入的是启发式缓存,而不是协商缓存)

    11. No-cache/No-store 区别

    no-cache: 可以在客户端存储资源,每次都必须去服务端做新鲜度校验,以此来决定从服务端获取新资源还是从客户端获取缓存。(协商缓存)
    no-store:永远不在客户端存储资源,每次都去原始服务器获取资源。(彻底不缓存)

    12. Max-age = 0,代表什么?

    max-age=0 暗示内容立即被认为是陈旧的(并且必须重新获取),这实际上与 Cache-Control: no-cache 相同。
    no-cachemax-age=0作为请求头,二者均会重新向服务器发起请求,哪怕该请求已被缓存。

    13. 预检请求?

    当一个请求跨域且不是简单请求时,就会发起一个OPTIONS请求,被称为预检请求。

    预检请求用于检查服务器是否支持CORS, 以便确认最终是否发送正常请求,由于它通过响应头进行判断,无需 Body,因此关于 OPTIONS 请求的状态码可选择 204 No Content

    如果预检请求失败,不允许跨域,则该复杂请求则会在浏览器控制台看到 CORS Error,并将该请求标记为红色。

    在 Chrome 浏览器控制台中,跨域复杂请求旁,有 pre-flight 链 接指向该请求的预检请求

    预检请求一般会携带以下三个请求头,用以向服务器咨询是否支持该跨域请求:

    是否支持 POST 方法
    Access-Control-Request-Method: POST

    是否支持携带 content-type 请求头
    Access-Control-Request-Headers: content-type

    来自域名 https://shanyue.tech 的跨域请求
    Origin: https://shanyue.tech
    同时回复响应头,用以确认是否支持CORS.

    允许跨域的头部
    Access-Control-Allow-Headers: Content-Type,Content-Length,Accept-Encoding,X-CSRF-Token,accept,origin,Cache-Control,X-Requested-With,X-USE-PPE,X-TT-ENV

    允许跨域的方法
    Access-Control-Allow-Methods: POST, OPTIONS, GET

    允许跨域的域名
    Access-Control-Allow-Origin: *

    OPTIONS 预检请求的缓存时间,即在 600s 内不会再次发送 OPTIONS 请求
    Access-Control-Max-Age: 600

    是否允许携带权限信息,比如 cookie 一类
    Access-Control-Allow-Credentials: true

    14. 简单请求

    满足以下条件的即为简单请求:
    1>. Method: 请求方法是GET,POST以及HEAD
    2>. Header: 请求头是conten-Type且其值为:Accept-Language、Content-Language.
    3>. Content-Type: 请求类型是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain

    15. 非简单请求

    一般需要开发者主动构造,常见的简单请求有:content-type: application/json及Authorization:。

    16. 设置默认携带cookie。(不设置则不携带)

    fetch 发送请求时配置 credentials: include
    server 响应时,配置响应头 access-control-allow-credentials: true
    另外,无法向配置 **access-control-allow-origin: *** 的域名发送 Cookie,否则报错
    在这里插入图片描述

    17. Fetch credentials

    credentials指在使用fetch发送请求时是否应当发送cookie.
    Omit: 从不发送
    Same-origin: 同源时发送,跨域则不发送。
    Include: 同源与跨域都会发送cookie。

    18. Access-Control-Allow-Origin

    取值为: | *
    其中,origin代表指定特定域名;* 代表所有域名。

    19. 如何设置多个域名?

    根据Origin请求头来设置响应头:Access-Control-Allow-Origin.
    a.总是设置 Vary: Origin,避免 CDN 缓存破坏 CORS 配置
    b.如果请求头不带有 Origin,证明未跨域,则不作任何处理
    c.如果请求头带有 Origin,证明浏览器访问跨域,根据 Origin 设置相应的 Access-Control-Allow-Origin:

    20. Vary: Origin,代表为不同的origin缓存不同的资源。

    使用语法为:Vary:,, …
    可理解为用以缓存的 key 值,常用于内容协商,因为内容协商往往会根据 Accept/Accept-Language 返回不同的资源。

    21. 同域名浏览器会自动携带上cookie。

    22. Cookie的属性 — 可跨域但不能跨站。

    • Domain: 为Cookie指定的域名。
    • Path: 为Cookie指定的路径
    • Expire/Max-age: Cookie的缓存时间。
    • HttpOnly:无法通过JS修改Cookie,但可以再浏览器看到其值。(可避免XSS攻击–跨站脚本攻击:通过注入脚本的方式获取到cookie,避免XSS攻击最有效的办法是CSP(内容安全策略),也是通过http配置.)
    • Secure: 仅能通过HTTPS协议传递
    • SameSite: 跨站点Cookie发送策略 (可用于防止CSRF攻击)

    23. CSRF(cross-site request forgery)

    跨站请求伪造,通过恶意引导用户一次点击劫持cookie及逆行攻击。

    24. SameSite的值?

    None: 任何情况下都会向第三方网站请求发送Cookie.
    Lax: 只有导航到第三方网站的Get链接会发送cookie,而跨域的图片iframe,fetch请求,form Post表单等都不会发送cookie.
    Strict: 任何情况下都不会向第三方网站请求发送cookie。

    25. 状态码

    100: 服务器检查请求头是否有问题。没问题返回100,有问题返回417.
    101: 表示正在切换协议,如从http切换到websocket.
    103: 提前声明对某些资源的优化提示
    preload: 预加载。
    preconnect: 提前建立链接。
    201: 一般用以POST请求,代表服务器资源创建成功。
    206: 当客户端指定 Range 范围请求头时,服务器端将会返回部分资源。当请求音视频资源体积过大时,一般使用 206 较多
    401:当没有权限的用户请求需要带有权限的资源时,会返回 401,此时携带正确的权限凭证再试一次可以解决问题
    413: Request Body过大,服务器处理不过来
    429: 超过某一个 API 的 Rate Limit 规则,会被限流.(不同的接口,有不同的限流规则)

    26. 502跟504区别

    502 Bad Gateway: 一般表现为你自己写的应用层服务(Java/Go/PHP)挂了,或者网关指定的上游服务直接指错了地址,网关层无法接收到响应

    • 504 Gateway Timeout: 一般表现为应用层服务 (Upstream) 超时,超过了 Gatway 配置的 Timeout,如查库操作耗时三分钟,超过了 Nginx 配置的超时时间

    扩展

    1. etag的生成策略

    (详见参考:https://blog.csdn.net/weixin_42989576/article/details/123695991)

    静态文件(如css,js,图片等):文件大小的16进制+修改时间

    字符串或Buffer:字符串/Buffer长度的16进制+对应hash值。

  • 相关阅读:
    【WSL】下载appx包将WSL装在非系统盘
    阿里云FPGA计算型f3云服务器配置性能详解
    LA@二次型@标准化相关原理和方法
    JavaScript concat() 方法
    (附源码)ssm医院挂号系统 毕业设计 250858
    【C++模拟实现】手撕红黑树(含图解)
    Capto2022中文版一款适用Mac屏幕录制编辑软件
    一款超好用的开源密码管理器?
    Dhtmlx KanBan 付费版使用
    react闪屏问题以及useEffect和useLayoutEffect的对比使用
  • 原文地址:https://blog.csdn.net/lucky569/article/details/128001899