1. 程式人生 > >HTTP詳解 2 -請求 響應 快取

HTTP詳解 2 -請求 響應 快取

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               


     

1. HTTP請求格式      

       做過Socket程式設計的人都知道,當我們設計一個通訊協議時,“訊息頭/訊息體”的分割方式是很常用的,訊息頭告訴對方這個訊息是幹什麼的,訊息體告訴對方怎麼幹。HTTP協議傳輸的訊息也是這樣規定的,每一個HTTP包都分為HTTP頭和HTTP體兩部分,訊息體是可選的,而訊息頭是必須的。每當我們開啟一個網頁,在上面點選右鍵,選擇“檢視原始檔”,這時看到的HTML程式碼就是HTTP的訊息體,那麼訊息頭可以通過瀏覽器的開發工具或者外掛可以看到,如果火狐的Firebug,IE的Httpwatch。

      客戶端通過傳送 HTTP 請求向伺服器請求對資源的訪問。 它向伺服器傳遞了一個數據塊,也就是請求資訊,HTTP 請求由三部分組成:請求行、  請求頭和請求正文。

 請求行:請求方法 URI 協議/版本

  請求頭(Request Header)

 

 請求正文

下面是一個HTTP請求的資料:

POST /index.php HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-cn,zh;q=0.5Accept-Encoding: gzip, deflateConnection: keep-aliveReferer: 
http://localhost/
Content-Length:25Content-Type:application/x-www-form-urlencoded username=aa&password=1234
 

1、請求行:請求方法URI協議/版本

 請求的第一行是“方法 URL  協議/版本”,並以 回車換行作為結尾。請求行以空格分隔。格式如下: POST /index.php HTTP/1.1 以上程式碼中“ GET”代表請求方法,“//ndex.php”表示URI,“HTTP/1.1代表協議和協議的版本。
        根據 HTTP標準,HTTP請求可以使用多種請求方法。例如:HTTP1.1支援7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。          URL完整地指定了要訪問的網路資源,通常只要給出相對於伺服器的根目錄的相對目錄即可,因此總是以“/”開頭,最後,協議版本聲明瞭通訊過程中使用HTTP的版本。   

請求方法

在 HTTP 協議中,HTTP 請求可以使用多種請求方法,這些方法指明瞭要以何種方式來訪問 Request-URI 所標識的資源。HTTP1.1 支援的請求方法如下表所示:

HTTP1.1 中的請求方式:
方法 作用
GET 請求獲取由 Request-URI 所標識的資源
POST 請求伺服器接收在請求中封裝的實體,並將其作為由 Request-Line 中的 Request-URI 所標識的資源的一部分
HEAD 請求獲取由 Request-URI 所標識的資源的響應訊息報頭
PUT

請求伺服器儲存一個資源,並用 Request-URI 作為其識別符號

DELETE 請求伺服器刪除由 Request-URI 所標識的資源
TRACE 請求伺服器回送到的請求資訊,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
 

重點介紹 GET、POST 和 HEAD 三個方法:

(1)GET

        GET 方法用於獲取由 Request-URI 所標識的資源的資訊,常見的形式是:

        GET Request-URI HTTP/1.1
        GET方法是預設的HTTP請求方法,例如當我們通過在瀏覽器的位址列中直接輸入網址的方式去訪問網頁的時候,瀏覽器採用的就是 GET 方法向伺服器獲取資源。

        我們可以使用GET方法來提交表單資料,用GET方法提交的表單資料只經過了簡單的編碼,同時它將作為URL的一部分向伺服器傳送,因此,如果使用GET方法來提交表單資料就存在著安全隱患上。例如:
         Http://localhost/login.php?username=aa&password=1234

        從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的資料是作為URL請求的一部分所以提交的資料量不能太大。這是因為瀏覽器對url的長度有限制

       各種瀏覽器也會對url的長度有所限制,下面是幾種常見瀏覽器的url長度限制:(單位:字元)

IE : 2803 Firefox:65536 Chrome:8182 Safari:80000 Opera:190000

(2)POST

          POST方法是GET方法的一個替代方法,它主要是向Web伺服器提交表單資料,尤其是大批量的資料。 在請求頭資訊結束之後的兩個回車換行之後(實際是空一行),就是表單提交的資料。如上面提到的post表單資料:

        username=aa&password=1234

        POST方法克服了GET方法的一些缺點。通過POST方法提交表單資料時,資料不是作為URL請求的一部分而是作為標準資料傳送給Web伺服器,這就克服了GET方法中的資訊無法保密和資料量太小的缺點。因此,出於安全的考慮以及對使用者隱私的尊重,通常表單提交時採用POST方法。

  從程式設計的角度來講,如果使用者通過 GET方法提交資料,則資料存放在QUERY_STRING環境變數中,而POST方法提交的資料則可以從標準輸入流中獲取。

 

 GET與POST方法有以下區別:

      1、  在客戶端,Get方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放在HTTP包的body中。

      2、 GET方式提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST則沒有此限制。

      3、安全性問題。正如在(1)中提到,使用 Get 的時候,引數會顯示在位址列上,而 Post 不會。所以,如果這些資料是中文資料而且是非敏感資料,那麼使用 get;如果使用者輸入的資料不是中文字元而且包含敏感資料,那麼還是使用 post為好。

      4.、伺服器取值方式不一樣。GET方式取值,如php可以使用$_GET來取得變數的值,而POST方式通過$_POST來獲取變數的值。

 

(3)HEAD

     HEAD 方法與 GET 方法幾乎是相同的,它們的區別在於 HEAD 方法只是請求訊息報頭,而不是完整的內容。對於 HEAD 請求的迴應部分來說,它的 HTTP 頭部中包含的資訊與通過 GET 請求所得到的資訊是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到 Request-URI 所標識的資源的資訊。這個方法通常被用於測試超連結的有效性,是否可以訪問,以及最近是否更新。

    要注意的是,在 HTML 文件中,書寫 get 和 post,大小寫都可以,但在 HTTP 協議中的 GET 和 POST 只能是大寫形式。

2. 請求頭

每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以新增任何數量的空格符,頭域可以被擴充套件為多行,在每行開始處,使用至少一個空格或製表符。

HTTP最常見的請求頭如下:

Transport 頭域

Connection:

作用:表示是否需要持久連線。

如果伺服器看到這裡的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1預設進行持久連線),它就可以利用持久連線的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,伺服器需要在應答中傳送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小;

例如: Connection: keep-alive   當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的  網頁,會繼續使用這一條已經建立的連線

例如:  Connection: close  代表一個Request完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線會關閉,  當客戶端再次傳送Request,需要重新建立TCP連線。

Host(傳送請求時,該報頭域是必需的)

Host請求報頭域主要用於指定被請求資源的Internet主機和埠號,它通常從HTTP URL中提取出來的。

eg:http://;localhost/index.html
瀏覽器傳送的請求訊息中,就會包含Host請求報頭域,如下:
Host:
localhost

此處使用預設埠號80,若指定了埠號8080,則變成:Host:localhost:8080

Client 頭域

Accept:

作用:瀏覽器可以接受的媒體型別(MIME型別),

例如:  Accept: text/html  代表瀏覽器可以接受伺服器回發的型別為 text/html  也就是我們常說的html文件, 如果伺服器無法返回text/html型別的資料,伺服器應該返回一個406錯誤(non acceptable)。

萬用字元 * 代表任意型別。例如  Accept: */*  代表瀏覽器可以處理所有型別,(一般瀏覽器發給伺服器都是發這個)

Accept-Encoding:

作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法(gzip,deflate),(注意:這不是隻字元編碼);

例如: Accept-Encoding: gzip, deflate。Server能夠向支援gzip/deflate的瀏覽器返回經gzip或者deflate編碼的HTML頁面。 許多情形下這可以減少5到10倍的下載時間,也節省頻寬。

Accept-Language:

作用: 瀏覽器申明自己接收的語言。 

語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;

例如: Accept-Language:zh-cn 。如果請求訊息中沒有設定這個報頭域,伺服器假定客戶端對各種語言都可以接受。

User-Agent:

作用:告訴HTTP伺服器, 客戶端使用的作業系統和瀏覽器的名稱和版本.

我們上網登陸論壇的時候,往往會看到一些歡迎資訊,其中列出了你的作業系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上, 伺服器應用程式就是從User-Agent這個請求報頭域中獲取到這些資訊User-Agent請求報頭域允許客戶端將它的作業系統、瀏覽器和其它屬性告訴伺服器。

例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept-Charset:

作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字元編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字元編碼方案);

例如:Accept-Charset:iso-8859-1,gb2312.如果在請求訊息中沒有設定這個域,預設是任何字符集都可以接受。

Authorization:授權資訊,通常出現在對伺服器傳送的WWW-Authenticate頭的應答中;

Authorization請求報頭域主要用於證明客戶端有權檢視某個資源。當瀏覽器訪問一個頁面時,如果收到伺服器的響應程式碼為401(未授權),可以傳送一個包含Authorization請求報頭域的請求,要求伺服器對其進行驗證。

Cookie/Login 頭域

Cookie:

作用: 最重要的header, 將cookie的值傳送給HTTP 伺服器

Entity頭域

Content-Length

作用:傳送給HTTP伺服器資料的長度。即請求訊息正文的長度;

例如: Content-Length: 38

Content-Type:

作用:

例如:Content-Type: application/x-www-form-urlencoded

Miscellaneous 頭域

Referer:

作用: 提供了Request的上下文資訊的伺服器,告訴伺服器我是從哪個連結過來的,比如從我主頁上鍊接到一個朋友那裡, 他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我主頁上的連結訪問    他的網站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

Cache 頭域

If-Modified-Since:

作用: 把瀏覽器端快取頁面的最後修改時間傳送到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行對比。如果時間一致,那麼返回304,客戶端就直接使用本地快取檔案。如果時間不一致,就會返回200和新的檔案內容。客戶端接到之後,會丟棄舊檔案,把新檔案快取起來,並顯示在瀏覽器中。

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

If-None-Match:

作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中新增ETag資訊。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match資訊(ETag的值)。如果伺服器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地快取檔案。否則將返回200狀態和新的資源和Etag.  使用這樣的機制將提高網站的效能

例如: If-None-Match: "03f2b33c0bfcc1:0"

Pragma:

作用: 防止頁面被快取, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣

Pargma只有一個用法, 例如: Pragma: no-cache

注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

Cache-Control:

作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的快取機制。各個指令含義如下

Cache-Control:Public   可以被任何快取所快取()

Cache-Control:Private     內容只快取到私有快取中

Cache-Control:no-cache  所有內容都不會被快取

2. HTTP響應格式      

      在接收和解釋請求訊息後,伺服器會返回一個 HTTP 響應訊息。與 HTTP 請求類似,HTTP 響應也是由三個部分組成,分別是:狀態行、訊息報頭和響應正文。如:


  

HTTP/1.1 200 OKDate: Sun, 17 Mar 2013 08:12:54 GMTServer: Apache/2.2.8 (Win32) PHP/5.2.5X-Powered-By: PHP/5.2.5Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Length: 4393Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=utf-8

<html><head><title>HTTP響應示例<title></head><body>Hello HTTP!</body></html>

 

1、狀態行

       狀態行由協議版本、數字形式的狀態程式碼,及相應的狀態描述組成,各元素之間以空格分隔,結尾時回車換行符,格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version 表示伺服器 HTTP 協議的版本,Status-Code 表示伺服器發回的響應程式碼,Reason-Phrase 表示狀態程式碼的文字描述,CRLF 表示回車換行。例如:

HTTP/1.1 200 OK (CRLF)

      狀態程式碼與狀態描述

      狀態程式碼由 3 位數字組成, 表示請求是否被理解或被滿足,狀態描述給出了關於狀態碼的簡短的文字描述。狀態碼的第一個數字定義了響應類別,後面兩位數字沒有具體分類。第一個數字有 5 種取值,如下所示。

  • 1xx:指示資訊——表示請求已經接受,繼續處理
  • 2xx:成功——表示請求已經被成功接收、理解、接受。
  • 3xx:重定向——要完成請求必須進行更進一步的操作
  • 4xx:客戶端錯誤——客戶端請求有錯誤或請求無法實現
  • 5xx:伺服器端錯誤——伺服器未能實現合法的請求。

常見狀態程式碼、狀態描述、說明:
200 OK      //客戶端請求成功

303:重定向,即從原url重定向到新的url。 例如php 的hear函式header("localtion:/index.php")

400 Bad Request  //客戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden  //伺服器收到請求,但是拒絕提供服務,一般是伺服器路徑沒有許可權或者是其他許可權相關問題
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤:一般來說,這個問題都會在伺服器端的原始碼出現錯誤時出現,比如出現死迴圈。

502 Bad Gateway//作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。比如LNMP ,php-fpm沒有啟動就會報502錯誤。

503 Server Unavailable  //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常,比如java 容器部署war的時候,就出現503,
                                           或者是nginx處理的檔案沒有許可權。


504 Gateway Time-out:作為閘道器或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應,比如nginx和php-fpm, php設定sleep(200),就會收到504 Gateway Time-out。注意:某些代理伺服器在DNS查詢超時時會返回400或者500錯誤


2、響應正文

響應正文就是伺服器返回的資源的內容,響應頭和正文之間也必須用空行分隔。如:

<html><head><title>HTTP響應示例<title></head><body>Hello HTTP!</body></html>

3 、響應頭資訊

HTTP最常見的響應頭如下所示:

Cache頭域

Date:

作用:生成訊息的具體時間和日期,即當前的GMT時間。

例如: Date: Sun, 17 Mar 2013 08:12:54 GMT

Expires:

作用: 瀏覽器會在指定過期時間內使用本地快取,指明應該在什麼時候認為文件已經過期,從而不再快取它。

例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT  

Vary

作用:

例如: Vary: Accept-Encoding

Cookie/Login 頭域

P3P

作用: 用於跨域設定Cookie, 這樣可以解決iframe跨域訪問cookie的問題

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

Set-Cookie

作用: 非常重要的header, 用於把cookie 傳送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.

例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

Entity實體頭域:

            實體內容的屬性,包括實體資訊型別,長度,壓縮方法,最後一次修改時間,資料有效性等。

ETag:

作用:  和If-None-Match 配合使用。 (例項請看上節中If-None-Match的例項)

例如: ETag: "03f2b33c0bfcc1:0"

Last-Modified:

作用: 用於指示資源的最後修改日期和時間。(例項請看上節的If-Modified-Since的例項)

例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

Content-Type:

作用:WEB伺服器告訴瀏覽器自己響應的物件的型別和字符集,

例如:

        Content-Type: text/html; charset=utf-8

  Content-Type:text/html;charset=GB2312

  Content-Type: image/jpeg

Content-Length:

指明實體正文的長度,以位元組方式儲存的十進位制數字來表示。在資料下行的過程中,Content-Length的方式要預先在伺服器中快取所有資料,然後所有資料再一股腦兒地發給客戶端。

  例如: Content-Length: 19847

Content-Encoding:

作用:文件的編碼(Encode)方法。一般是壓縮方式。

WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的物件。利用gzip壓縮文件能夠顯著地減少HTML文件的下載時間。

例如:Content-Encoding:gzip

Content-Language:

作用: WEB伺服器告訴瀏覽器自己響應的物件的語言者

例如: Content-Language:da

Miscellaneous 頭域

Server:

作用:指明HTTP伺服器的軟體資訊

例如:Apache/2.2.8 (Win32) PHP/5.2.5

X-Powered-By:

作用:表示網站是用什麼技術開發的

例如: X-Powered-By: PHP/5.2.5

Transport頭域

Connection:

例如: Connection: keep-alive   當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線

例如:  Connection: close  代表一個Request完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線會關閉, 當客戶端再次傳送Request,需要重新建立TCP連線。

Location頭域

Location:

作用: 用於重定向一個新的位置, 包含新的URL地址

例項請看304狀態例項

HTTP協議是無狀態的和Connection: keep-alive的區別

  無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。從另一方面講,開啟一個伺服器上的網頁和你之前開啟這個伺服器上的網頁之間沒有任何聯絡。

  HTTP是一個無狀態的面向連線的協議,無狀態不代表HTTP不能保持TCP連線,更不能代表HTTP使用的是UDP協議(無連線)。

  從HTTP/1.1起,預設都開啟了Keep-Alive,保持連線特性,簡單地說,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。

  Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。

 

3. 瀏覽器快取      

          

       瀏覽器快取:包括頁面html快取和圖片js,css等資源的快取。如下圖,瀏覽器快取是基於把頁面資訊儲存到使用者本地電腦硬盤裡。

       


1、快取的優點:

     1)伺服器響應更快:因為請求從快取伺服器(離客戶端更近)而不是源伺服器被相應,這個過程耗時更少,讓伺服器看上去響應更快。

     2)減少網路頻寬消耗:當副本被重用時會減低客戶端的頻寬消耗;客戶可以節省頻寬費用,控制頻寬的需求的增長並更易於管理。

1、快取工作原理

       頁面快取狀態是由http header決定的,一個瀏覽器請求資訊,一個是伺服器響應資訊。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0規定,Cache-Control由HTTP/1.1規定。

       工作原理圖:

 

從圖中我們可以看到原理主要分三步:

  1. 第一次請求:瀏覽器通過http的header報頭,附帶Expires,Cache-Control,Last-Modified/Etag向伺服器請求,此時伺服器記錄第一次請求的Last-Modified/Etag                  
  2. 再次請求:當瀏覽器再次請求的時候,請求頭附帶Expires,Cache-Control,If-Modified-Since/Etag向伺服器請求
  3. 伺服器根據第一次記錄的Last-Modified/Etag和再次請求的If-Modified-Since/Etag做對比,判斷是否需要更新伺服器通過這兩個頭判斷本地資源未發生變化,客 戶端不需要重新下載,返回304響應。常見流程如下圖所示



與快取相關的HTTP擴充套件訊息頭

    Expires:設定頁面過期時間,格林威治時間GMT

    Cache-Control:更細緻的控制快取的內容

    Last-Modified:請求物件最後一次的修改時間 用來判斷快取是否過期 通常由檔案的時間資訊產生 

    ETag:響應中資源的校驗值,在伺服器上某個時段是唯一標識的。ETag是一個可以 與Web資源關聯的記號(token),和Last-Modified功能才不多,也是一個識別符號,一般和Last-Modified一起使用,加強伺服器判斷的準確度。

    Date:伺服器的時間

    If-Modified-Since:客戶端存取的該資源最後一次修改的時間,用來和伺服器端的Last-Modified做比較

    If-None-Match:客戶端存取的該資源的檢驗值,同ETag。

Cache-Control的主要引數
      Cache-Control: private/public Public 響應會被快取,並且在多使用者間共享。 Private 響應只能夠作為私有的快取,不能再使用者間共享。
      Cache-Control: no-cache:不進行快取
      Cache-Control: max-age=x:快取時間 以秒為單位
      Cache-Control: must-revalidate:如果頁面是過期的 則去伺服器進行獲取。


我們nginx測試:

server {
        listen       8081;
        server_name  10.163.1.175;
        if ($host != 'www.test1.com' ) {
            #rewrite ^/(.*)$ http://www.test1.com/$1 permanent;
        }
        index index.html index.htm index.php;
        root  /home/www/app/;


        access_log  /mnt/app/nginx/logs/test1.home.log  main;


        location ~ .*\.zip?$
        {
               access_log off;
        }
        location ~ .*\.txt?$ {
                access_log off;
        }


        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
                expires      30d;
        }


        location ~ .*\.(js|css|zip)?$
        {
                expires      12h;
        }




        if (!-e $request_filename) {
            rewrite ^/(.+)$ /index.php?url=$1 last;
            break;
        }


        location ~ .*\.(php|php5)?$
        {
                #fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
                add_header Content-Type text/html;
        }
}

然後我們代理兩個域名指向同一個埠:

server {
    listen  80;
    server_name   www.test1.com  test1.com;


    location / {
        proxy_pass         http://127.0.0.1:8081;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forward-For    $proxy_add_x_forwarded_for;
        proxy_set_header Access-Control-Allow-Origin *;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
    }
}
server {
    listen  80;
    server_name   www.test2.com  test2.com;


    location / {
        proxy_pass         http://127.0.0.1:8081;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forward-For    $proxy_add_x_forwarded_for;
        proxy_set_header Access-Control-Allow-Origin *;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
    }
}


我們訪問www.test2.com,直接指向www.test1.com,http是304響應。


當我們把8081埠的配置去掉

        if ($host != 'www.test1.com' ) {
            #rewrite ^/(.*)$ http://www.test1.com/$1 permanent;
        }
   重啟nginx,同一個訪問www.test2.com,發現還是直接跳轉到www.test1.com。

這是因為瀏覽器304快取的問題。我們直接使用新瀏覽器訪問,就直接訪問就不會跳轉啦。



  


2、關於圖片,css,js,flash的快取

這個主要通過伺服器的配置來實現這個技術,如果使用apache伺服器的話,可以使用mod_expires模組來實現:

編譯mod_expires模組:

Cd  /root/httpd-2.2.3/modules/metadata

/usr/local/apache/bin/apxs -i -a -c mod_expires.c //編譯

編輯httpd.conf配置:新增下面內容

<IfModule mod_expires.c>

ExpiresActive on

ExpiresDefault "access plus 1 month"

ExpiresByType text/html "access plus 1 months"

ExpiresByType text/css "access plus 1 months"

ExpiresByType image/gif "access plus 1 months"

ExpiresByType image/jpeg "access plus 1 months"

ExpiresByType image/jpg "access plus 1 months"

ExpiresByType image/png "access plus 1 months"

EXpiresByType application/x-shockwave-flash "access plus 1 months"

EXpiresByType application/x-javascript      "access plus 1 months"

#ExpiresByType video/x-flv "access plus 1 months"

</IfModule>

解釋:第一句--開啟服務

第二句--預設時間是一個月

在下面是關於各種型別的資源的快取時間設定


(快取的部分修改自http://www.cnblogs.com/phphuaibei/archive/2011/09/27/2192817.html)  




感謝您的支援,我會繼續努力的! 掃碼打賞,你說多少就多少

         
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述 你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文字居中 第二列文字居右 第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 現有任務
        已完成               :done,    des1, 2014-01-06,2014-01-08
        進行中               :active,  des2, 2014-01-09, 3d
        計劃一               :         des3, after des2, 5d
        計劃二               :         des4, after des3, 5d
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::

這將產生一個流程圖。:

  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎