我在 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
與我交流,備註交流。另外能夠關注個人公衆號【全棧成長之路】