1. 程式人生 > >WEB應用之httpd基礎入門(五)

WEB應用之httpd基礎入門(五)

  前文我們聊到了httpd的啟動使用者和相關許可權的說明,資源壓縮配置、https的實現,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12593675.html;今天我們來說說httpd的重定向、HSTS、反向代理的配置;

  首先來了解下重定向吧,什麼意思呢?假如我們訪問一個資源在伺服器上不存在或者不在我們對應訪問URL下,而使用者又不知道我們新的URL的情況下,我們怎麼讓使用者訪問到我們新的URL呢?平常我們訪問某度,在瀏覽器上直接鍵入某度的域名,然後瀏覽器就直接給我們響應,心細的你還會發現響應的不是http而是https,我們明明沒有用https訪問某度,為什麼響應的頁面卻是https呢?其實這就是http的重定向;所謂重定向就是我們訪問的URL對應資源不再原來的位置,而對於使用者來說,使用者數不知道URL背後對應的位置上哪裡,如果服務端不配置重定向,那麼使用者訪問到的資源要麼不是最新的要麼訪問不到,為了解決這樣一個問題,重定向就起著把使用者的請求轉發到新URL上的作用;它的原理是這樣的,使用者訪問某一資源,當服務端收到使用者的請求後,檢查使用者訪問的URL對應資源不在原來的位置,此時伺服器會以301或302的狀態碼響應客戶端,意思就是告訴客戶端訪問的資源不再這個位置,對應的位置服務端會通過location首部告訴客戶端,客戶端收到這個響應報文後會再次向服務端新發來的URL再次請求,得到響應的資源響應;

  httpd實現重定向需要用到redirect指令,它的配置語法是Redirect [status] URL-path URL;status表示狀態資訊,permanent表示返回永久重定向狀態碼 301;temp表示返回臨時重定向狀態碼302. 此為預設值;

  示例:把使用者訪問http的請求臨時重定向到https

   提示:以上配置意思是使用者訪問/https這個URI的時候,就會臨時重定向到https://www.test.com,當然redirect這個指令可以用在server配置段中,虛擬主機配置段中,也可以用在directory配置段中和.htaccess檔案中;

  測試:

   提示:可以看到我們訪問www.test.com/https,瀏覽器訪問這個URL時,在響應報文中給我們了一個location響應首部,並且把新的URL告訴我們,然後瀏覽器自動去訪問location中的新URL ,最終把https://www.test.com的響應結果給我們;

  示例2:通過rewrite來實現http訪問跳轉為https

   提示:以上配置表示,開啟rewrite功能,並對使用者訪問任何內容的的URI 重寫為https://使用者訪問的請求報文中host首部/index.html,意思就是使用者訪問www.test.com/abc.html服務端收到這樣的請求後,它會把使用者的URL重寫為https://www.test.com/index.html,不管使用者訪問www.test.com下的任何內容,都會被處理為訪問https://www.test.com/index.html

  測試:

   提示:可以看到我們在瀏覽器上不管訪問www.test.com/下的任何內容,都給我們跳轉為https://www.test.com/index.html了;

  HSTS:HTTP Strict Transport Security,翻譯過來就是http嚴格傳輸安全,我們通過上面的示例可以發現一個點,就是使用者第一次訪問服務端的時候,它倆是通過http協議傳輸資料,眾所周知http協議是明文傳輸資料的,假設使用者第一次訪問服務端的時候,被黑客中間把資料截獲並篡改了,可想而知,客戶端收到不是真正服務端的資訊,而是被黑客篡改了的響應報文,後續客戶端就很可能不是訪問真正服務端響應給客戶端的URL,而是黑客篡改後的,這樣一來無疑存在著安全隱患;為了解決這樣的問題,伺服器端配置支援HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS欄位。瀏覽器獲取到該資訊後,會將所有HTTP訪問請求在內部做307跳轉到HTTPS。而無需任何網路過程,這樣一來黑客就無法通過網路來抓取我們的資訊;HSTS preload list是Chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用Chrome瀏覽器訪問時,會自動轉換成HTTPS。Firefox、Safari、Edge瀏覽器也會採用這個列表;意思就是在HSTS preload list中的網站就可以實現在瀏覽器內部跳轉把http跳轉為https;

  httpd配置實現HSTS是通過Header always set Strict-Transport-Security 指令實現,後面要給定一個最大時長,表示在給定的時長瀏覽器請求該網站都會使用https去訪問;

  示例:

   提示:以上表示設定strict-transport-security響應首部的值為max-age=31536000,這樣配置後,我們自己的網站就支援HSTS

   提示:可以看到我們訪問www.test.com對應響應報文就有Strict-Transport-Security響應首部;

   httpd作為代理伺服器;

  首先我們來了解代理的概念吧,所謂代理就是自己沒有能力去做的事,讓別人幫著做,我們把這種幫別人幹事的角色稱為代理,我不知道這樣解釋是否正確;比如,我們想去訪問某網站,但是該網站卻只有特定的網路才可以訪問得到,這個時候如何讓其他非特定網路的其他使用者訪問到呢?其實代理就是這個作用,作為客戶端,代理可以幫助客戶端去訪問特定網路的資源,作為服務端,代理可以幫助服務端響應客戶端的請求;它兩不同的是,在客戶端的那一側我們通常叫正向代理,意思就是代理客戶端訪問特定網路資源,這只是針對http web服務來講是這樣的,但無論怎樣講,正向代理就是幫助客戶端去幹某事;在服務端一側我們通常把代理叫做反向代理,意思就是它代理服務端響應客戶端的請求;代理其實我們可以理解為中間的“人”,它既當客戶端,又當服務端,只是我們站在不同的角度對它的稱呼不一樣;正向代理的角色的原理就是當客戶端的報文傳送到代理伺服器後,代理客戶端會更改客戶端的源IP或源埠資訊;在真正服務端上看到的請求通常是正向代理的ip和埠;而對於反向代理來說,它主要是代理服務端響應客戶端的請求,它通常是修改客戶端的目標IP或目標埠,在客戶端響應的報文裡看,通常是代理伺服器的作為響應報文的源IP或源埠的響應,而在後端真正提供服務的服務端上看,請求報文通常是反向代理伺服器的源IP或源埠;從上面的描述,代理伺服器承擔了兩個角色,面向客戶端它是服務端,面向服務端它是客戶端;所以我們在客戶端看到的響應報文源IP資訊和埠都是代理伺服器的,在服務端看到的請求報文源埠資訊也都是代理伺服器的源埠資訊;通常情況下正向代理除了可以幫助客戶端訪問外界資源外,它還可以起到隱藏客戶端的目的;而對於反向代理,它除了可以幫助服務端響應客戶端的請求,同時它也可以起到隱藏服務端的作用,這樣一來,客戶端和服務端都是通過代理實現了資料互動;在現實生活中我們訪問的web服務通常都是基於這兩種代理來的,這也是代理最重要的作用;

   httpd反向代理的功能是基於proxy模組實現的,其中最常用也是最重要的指令是proxypass和ProxyPassReverse

  示例:

   提示:以上配置表示客戶端訪問/nginx這個URI時,會將使用者請求反代到後面我們真正指定的網站上;也就是說我們用瀏覽器訪問www.test.com/nginx就會訪問到nginx官方主頁上去;

   提示:可以看到我們在虛擬主機里加了proxypass和proxypassreverse指令後,我們訪問對應URI,瀏覽器會將我們的請求跳轉到對應我們指定的URL上去;當然我們也可以把proxypass指令用於location中;而proxypassreverse指令的主要作用是防止客戶端繞過反代伺服器,直接請求後端主機;以上就是httpd簡單指令的使用更多關於httpd指令的使用,請參考官方文件示例說