2011-06-21 54 views
11

Web服務器如何實現url重寫機制並更改瀏覽器的地址欄?
我沒有要求具體的信息來配置Apache,Nginx的,lighthttpd或其他!
我想知道什麼樣的信息發送到客戶端時,服務器要重寫url?url重寫是如何工作的?

+0

看看RFC 2616的10.3節:http://www.ietf.org/rfc/rfc2616.txt –

回答

4

你說的是服務器端重寫(比如Apache mod-rewrite)嗎?對於這些,地址欄通常不會改變(除非執行重定向)。 或者你在談論重定向?這些通過讓服務器用HTTP代碼(301,302或307)和HTTP頭中的位置來響應來完成。

+0

我在談論服務器端規則。謝謝! – cirne100

1

傑夫阿特伍德有關於這個偉大的帖子:http://www.codinghorror.com/blog/2007/02/url-rewriting-to-prevent-duplicate-urls.html

Web服務器如何實現URL重寫機制,改變了瀏覽器的地址欄?

URL重寫和轉發是兩個完全不同的東西。 服務器無法控制您的瀏覽器,因此無法更改瀏覽器的網址,但它可能會要求您的瀏覽器轉到其他網址。當瀏覽器從服務器獲得響應時,完全由瀏覽器決定如何處理該響應:它可以遵循重定向,忽略它或者確實意味着將服務器發送給服務器,直到服務器放棄爲止。服務器沒有用來更改地址的「機制」,它只是一個協議(HTTP 1.1),服務器在特定資源移動到其他位置時遵守的協議(即HTTP 1.1),即3xx響應。

+0

-1我沒有看到那篇文章中描述它是如何工作的任何地方。 – Davy8

+0

@ Davy8,當我的老闆把我叫進他的辦公室時,我正在編輯我的問題並添加所有這些信息:)......現在已經太晚了。 – Kiril

2

URL重寫可以純粹在服務器端轉換URL。這使得Web應用程序開發人員能夠從多個URL訪問Web資源。

例如,用戶可能請求http://www.example.com/product/123,但是由於重寫實際上是從http://www.example.com/product?id=123服務的資源。請注意,瀏覽器中顯示的地址不需要更改。

如果需要,可以更改地址。爲此,在服務器上發生了與上述類似的映射,但服務器不是將資源呈現給客戶端,而是將重定向(301或302 HTTP代碼)發送回客戶端以用於重寫的URL。

對於上面這個例子可能看起來像:

客戶端請求

GET /product/123 HTTP/1.1 
Host: www.example.com 

服務器響應

HTTP/1.1 302 Found 
Location: http://www.example.com/product?id=123 

此時,瀏覽器會發出針對URL的新GET請求在Location標題中。

2

有兩種形式的「URL重寫」:純粹在服務器內部和那些重定向的情況下完成的。

如果它純粹在服務器內部,這是一個內部問題,並且只與服務器中實現的調度機制有關。例如,在Apache HTTPD中,mod_rewrite可以做到這一點。

如果是重定向,則會在響應中發送暗示重定向的狀態碼,同時發送一個Location標頭,指示瀏覽器應該重定向到哪個URL(這應該是絕對URL)。 mod_rewrite也可以這樣做,用[R]標誌。 狀態代碼通常是302 (found),但可以配置爲其他代碼(例如301或307)。

另一個非常常見的用途(通常不被注意,因爲它通常默認在Apache HTTPD中)是在目錄上重定向到帶有斜線的URL。這是由mod_dir實現:

A「斜線」,當服務器收到 請求重定向發出 一個URL http://servername/foo/dirname 其中目錄名是一個目錄。 目錄需要一個斜槓, ,所以mod_dir發出重定向到 http://servername/foo/dirname/

29

有兩種類型的行爲。

一個是重寫,另一個是重定向。

重寫

服務器執行替代本身,使得像http://example.org/my/beatuful/page一個URL被理解爲http://example.org/index.php?page=my-beautiful-page

隨着改寫,客戶端不會看到任何和重定向僅供內部使用。瀏覽器中沒有URL更改,只是服務器以不同的方式理解它。

重定向

服務器檢測到服務器不需要該地址。 http://example.org/page1已移至http://example.org/page2,因此它會通過HTTP 3xx代碼告知瀏覽器新頁面是什麼。然後客戶請求這個頁面。因此瀏覽器中的地址發生變化!

過程

過程保持不變,既受這個圖來描述:

enter image description here

備註每重寫/重定向觸發器來重寫規則新的呼叫(有例外IIRC )

​​

可能對停止循環有用。 (既然它已經發生過一次,所以不會重寫)。

+0

可以請你解釋一下'RewriteCond%{REDIRECT_URL}!^ $ RewriteRule。* - [L]'多一點 – vipin8169

+0

Apache在內部重定向發生時創建這個重定向變量。所以你可以在處理新的重定向之前檢查它是否爲空。 –

+0

重寫標誌在這裏解釋[link](http://httpd.apache.org/docs/2.2/rewrite/flags.html) – Athiruban