我在 github 上新建了一个仓库 日问,天天一道面试题,有关前端,后端,devops以及软技能,促进职业成长,敲开大厂之门,欢迎交流css
而且记录个人面试经验html
计算机网络 |
算法与数据结构 |
操做系统 |
Linux基础 |
http |
vim |
git前端
CSS |
Javascript |
html |
React |
Vue |
Webpack |
前端工程化vue
DevOps |
Docker |
kubernetespython
开放式问题react
查看全部问题linux
在 Issue 中交流与讨论: 答案解析
最喜欢见到的状态码,表示请求成功
永久重定向
临时重定向
自上次请求,未修改的文件
错误的请求
未被受权,须要身份验证,例如token信息等等
请求被拒绝
资源缺失,接口不存在,或请求的文件不存在等等
服务器端的未知错误
网关错误
服务暂时没法使用
在 Issue 中交流与讨论: 答案解析
在 Issue 中交流与讨论: 答案解析
The server was acting as a gateway or proxy and received an invalid response from the upstream server.
收到了上游响应但没法解析webpack
The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.
上游响应超时nginx
在 Issue 中交流与讨论: 答案解析
<blockquote> 更多描述: 如 webpack-dev-server
能够设置 proxy,nginx
也能够设置 </blockquote>
在 Issue 中交流与讨论: 答案解析
todo
在 Issue 中交流与讨论: 答案解析
在 Issue 中交流与讨论: 答案解析
在 Issue 中交流与讨论: 答案解析
在 Issue 中交流与讨论: 答案解析
gzip
使用了 LZ77
算法与 Huffman
编码来压缩文件,重复度越高的文件可压缩的空间就越大。
在 Issue 中交流与讨论: 答案解析
不须要开启,若是开启的话,有可能使图片变的更大。若是你注意一些网站的 img 资源时,就会发现他们都没有开启 gzip
参考: https://webmasters.stackexcha...
Don't use gzip for image or other binary files.Image file formats supported by the web, as well as videos, PDFs and other binary formats, are already compressed; using gzip on them won't provide any additional benefit, and can actually make them larger. To compress images, see Optimize images.
在 Issue 中交流与讨论: 答案解析
以 nc
模拟 http 报文以下
$ nc www.baidu.com 80 GET / HTTP/1.1 Host: www.baidu.com HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: no-cache Connection: Keep-Alive Content-Length: 14615 Content-Type: text/html Date: Tue, 10 Dec 2019 02:48:44 GMT P3p: CP=" OTI DSP COR IVA OUR IND COM " P3p: CP=" OTI DSP COR IVA OUR IND COM " Pragma: no-cache Server: BWS/1.1 Set-Cookie: BAIDUID=F0FC6B3A056DEA285F51A1F2F8A170BB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BIDUPSID=F0FC6B3A056DEA285F51A1F2F8A170BB; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: PSTM=1575946124; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BAIDUID=F0FC6B3A056DEA287CB2B9422E09E30E:FG=1; max-age=31536000; expires=Wed, 09-Dec-20 02:48:44 GMT; domain=.baidu.com; path=/; version=1; comment=bd Traceid: 1575946124058431156210725656341129791126 Vary: Accept-Encoding X-Ua-Compatible: IE=Edge,chrome=1 <!DOCTYPE html><!--STATUS OK--> ........内容省略
在 Issue 中交流与讨论: 答案解析
关于 etag
的生成须要知足几个条件
etag
值保持不变。因此不能单纯使用 inode
hash
不是特别合适node
上生成的 etag
值一致。这样子 inode
就排除了关于服务器中 etag
如何生成能够参考 HTTP: Generating ETag Header
那么在 nginx
中的 etag
是如何生成的?
我在网上找到一些资料与源代码了解到了 etag
的计算方法。由 python
伪代码表示计算方法以下
etag = '{:x}-{:x}'.format(header.last_modified, header.content_lenth)
etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"", r->headers_out.last_modified_time, r->headers_out.content_length_n) - etag->value.data;
总结:nginx
中 etag
由响应头的 Last-Modified
与 Content-Length
表示为十六进制组合而成。
随手在个人k8s集群里找个 nginx
服务测试一下
$ curl --head 10.97.109.49 HTTP/1.1 200 OK Server: nginx/1.16.0 Date: Tue, 10 Dec 2019 06:45:24 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT Connection: keep-alive ETag: "5cbee66d-264" Accept-Ranges: bytes
由 etag
计算 Last-Modified
与 Content-Length
,使用 js
计算以下,结果相符
> new Date(parseInt('5cbee66d', 16) * 1000).toJSON() "2019-04-23T10:18:21.000Z" > parseInt('264', 16) 612
咱们知道协商缓存有两种方式
Last-Modified
/if-Modified-Since
ETag
/If-None-Match
既然在 nginx
中 ETag
由 Last-Modified
和 Content-Length
组成,那它便算是一个增强版的 Last-Modified
了,那增强在什么地方呢?
Last-Modified
是由一个 unix timestamp
表示,则意味着它只能做用于秒级的改变
那下一个问题:若是 http 响应头中 ETag 值改变了,是否意味着文件内容必定已经更改
在 Issue 中交流与讨论: 答案解析
不必定,由服务器中 ETag
的生成算法决定。详见 #112
好比 nginx
中的 etag
由 last_modified
与 content_length
组成,而 last_modified
又由 mtime
组成
当编辑文件却未更改文件内容时,或者 touch file
,mtime
也会改变,此时 etag
改变,可是文件内容没有更改。
在 Issue 中交流与讨论: 答案解析
通常会选文件的 mtime
,表示文件内容的修改时间
nginx
也是这样处理的,源码见: ngx_http_static_module.c
r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = of.size; r->headers_out.last_modified_time = of.mtime;
关于为何使用 mtime
而非 ctime
,能够参考 #116
在 Issue 中交流与讨论: 答案解析
经过 cookie 或者 Authorization header 来传递凭证,在服务端进行认证
在 Issue 中交流与讨论: 答案解析
https主要解决三个安全问题:
https并非直接经过非对称加密传输过程,而是有握手过程,握手过程主要是和服务器作通信,生成私有秘钥,最后经过该秘钥对称加密传输数据。还有验证证书的正确性。
证书验证过程保证了对方是合法的,而且中间人没法经过伪造证书方式进行攻击。
在 Issue 中交流与讨论: 答案解析
通常有两个 response header,有时服务端为了隐蔽本身真实的技术栈会隐蔽这两个字段
X-Powerd-By
Server
在 Issue 中交流与讨论: 答案解析
是有必要的,由于咱们不知道会途径会不会有代理出现, 若是直接到达服务器的话,服务器是能够经过路径知道资源在哪,可是若是经过代理的话,代理没法得知具体服务器是什么地址
在 Issue 中交流与讨论: 答案解析
表明二进制流,通常用如下载文件
在 Issue 中交流与讨论: 答案解析
通常用做 301
的较为多,可是也有使用 302
,若是开启了 HSTS
则会使用 307
如知乎使用了 302,淘宝使用了 301
$ curl --head www.zhihu.com HTTP/1.1 302 Found Date: Tue, 24 Dec 2019 00:13:54 GMT Content-Length: 22 Connection: keep-alive Server: NWS_TCloud_IPV6 Location: https://www.zhihu.com/ X-NWS-LOG-UUID: 0e28d9a1-6aeb-42cd-9f6b-00bd6cf11500 $ curl --head www.taobao.com HTTP/1.1 301 Moved Permanently Server: Tengine Date: Tue, 24 Dec 2019 00:13:58 GMT Content-Type: text/html Content-Length: 278 Connection: keep-alive Location: https://www.taobao.com/ Via: cache20.cn1480[,0] Timing-Allow-Origin: * EagleId: 6f3f38a815771464380412555e
在 Issue 中交流与讨论: 答案解析
LM-Factor
与它俩有关。
简而言之,一个静态资源没有设置 Cache-Control
时会以这两个响应头来设置强制缓存时间,而非直接进行协商缓存。在涉及到 CDN 时,表现更为明显,体如今更新代码部署后,界面没有更新。
在 Issue 中交流与讨论: 答案解析
在 http 1.1
中,在响应头中设置 keep-alive
能够在一个 TCP 链接上发送多个 http 请求
在服务器端使用响应头开启 keep-alive
Connection: Keep-Alive Keep-Alive: timeout=5, max=1000
我是山月,能够加我微信
shanyue94
与我交流,备注交流。另外能够关注个人公众号【全栈成长之路】