Apache HTTP Server 映射URL到檔案系統

來源:互聯網
上載者:User

標籤:反向 Proxy伺服器   img   抓取   頁面   遠程   user   配置   反向 Proxy   技術   

本文解釋了Apache HTTP Server如何應用請求的URL來決定擷取文檔的檔案系統位置。DocumentRoot

對於決定向一個請求響應什麼內容,httpd的預設行為是取得請求的URL-Path(主機名稱和連接埠號碼後面的URL路徑),然後把它加在設定檔中指定的DocumentRoot後面。因此,在DocumentRoot下面的檔案和目錄構成了web基本的文檔樹。

例如,如果DocumentRoot被設定為/var/www/html,那麼請求 http://www.example.com/fish/guppies.html 將會獲得/var/www/html/fish/guppies.html作為用戶端響應。

如果請求的是一個目錄(也就是 path以/結尾), 那麼響應的檔案是由 DirectoryIndex 指令指定的。例如如果DocumentRoot按照上面的設定,然後設定

 DirectoryIndex index.html index.php

如果這些檔案不存在,那麼如果mod_autoindex模組被載入並且配置允許的話,就會嘗試提供一個目錄索引。

httpd還具有Virtual Hosting的能力,Virtual Hosting可以讓httpd能夠接受多個主機的請求。在這種情況下,可以為每一個虛擬機器主機指定一個DocumentRoot,mod_vhost_alias 模組提供的目錄可以被用來根據請求的IP地址或者主機名稱動態決定提供檔案的合適位置。

DocumentRoot指令可以被設定在主設定檔中(httpd.conf),但是更有可能的是,為每一個虛擬機器主機指定一個 DocumentRoot。

DocumentRoot之外的檔案

經常會有這樣的情況:我們需要web來訪問DocumentRoot之外的檔案。httpd提供了幾種方式來實現這個需求。在Unix系統中,軟串連(symbolic links)可以用來將其他位置的檔案放到DocumentRoot之內。 為了安全考慮,httpd只有在相關目錄的Options設定中包含有FollowSymLinks 或者SymLinksIfOwnerMatch時才會允許訪問軟串連。

或者我們可以使用Alias指令來將檔案系統中的任意位置映射到web空間中。 例如,設定

Alias "/docs" "/var/web"

那麼請求http://www.example.com/docs/dir/file.html將會被響應 /var/web/dir/file.html。 ScriptAlias 指令能夠起到同樣的效果,只不過請求訪問的到目標檔案會被作為CGI指令碼看待。

對於需要更大靈活性的情況,我們可以使用AliasMatch 和ScriptAliasMatch 指令來指定基於匹配和替換的強大的Regex。例如:

ScriptAliasMatch "^/~([a-zA-Z0-9]+)/cgi-bin/(.+)" "/home/$1/cgi-bin/$2"

將會將請求 http://example.com/~user/cgi-bin/script.cgi 映射到檔案系統中的 /home/user/cgi-bin/script.cgi, 並把這個映射到的目標檔案作為CGI指令碼看待。

使用者目錄(user-dir)

在傳統的Unix系統中,一個特定的使用者的家目錄可以使用~user/來訪問。mod_userdir 模組將這個用法擴充到了web中來: 我們可以使用下面的這樣的URL來訪問位於每個使用者家目錄中的檔案。

http://www.example.com/~user/file.html

基於安全考慮,從web中直接存取使用者的家目錄是不合適的。因此, UserDir指令可以指定一個位於使用者家目錄下面的目錄,用來存放web檔案。UserDir的預設值為public_html, 所以上面的URL將被映射到/home/user/public_html/file.html。其中/home/user是在/etc/passwd中指定的使用者家目錄。

對於/etc/passwd中不存在使用者家目錄路徑的系統,我們可以使用其他幾種形式的UserDir。

有些人認為在URL中使用~符號(經常會被url轉碼為%7e)是不合適,他們更喜歡使用另外一個字串來代表使用者家目錄。mod_userdir模組並不支援這個功能。但是,如果使用者的家目錄是按照一個有規律的方式組織的話,那麼使用AliasMatch 指令是可能達到期待的效果的。例如,為了將 http://www.example.com/upages/user/file.html映射到/home/user/public_html/file.html,可以使用下面的AliasMatch指令:

AliasMatch "^/upages/([a-zA-Z0-9]+)(/(.*))?$" "/home/$1/public_html/$3"URL重新導向

上面討論的配置指令用來讓httpd從檔案系統中的特定位置獲得檔案來響應用戶端。 但是有時,我們期待能夠告訴用戶端請求的內容位於另一個URL中,從而使得用戶端可以發送一個新的對於這個URL的請求。這種機制被稱為 重新導向(redirection), 可以使用Redirect 指令來實現。例如,如果DocumentRoot下的/foo/目錄中的內容全部移到了另一個目錄/bar/下面,你可以指示用戶端重新發送一個請求來擷取新目錄下面的檔案。

Redirect permanent "/foo/" "http://www.example.com/bar/"

上面的配置將會將以/foo/開頭的URL-Path重新導向到www.example.com下面的將/foo/替換為/bar/的相同路徑上,例如 http://www.yousite.com/foo/fish/guppies.html 將會被重新導向到 http://www.example.com/bar/fish/guppies.html。 就像上面的例子那樣,我們可以將用戶端重新導向到任意的server,並不局限於原始的server。

httpd同樣提供了RedirectMatch指令來應對更加複雜的重新導向問題。例如,為了將網站的首頁重新導向到另一個網站,但是其他的訪問並不重新導向,可以使用下面的配置:

RedirectMatch permanent "^/$" "http://www.example.com/startpage.html"

或者,可以像下面這樣將一個網站的所有頁面全部重新導向到另一個網站中:

RedirectMatch temp ".*" "http://othersite.example.com/startpage.html"

注釋1: 上面兩個配置中的 permanent 和 temp將會作用到用戶端收到的重新導向響應(301)的頭資訊中。

注釋2: 下面將會講到httpd的反向 Proxy,在此我們首先需要明確重新導向最重要的特性是: 服務端會主動讓用戶端接受到301 重新導向響應,然後讓用戶端重新發起一個新的請求,也就是說用戶端對於這個過程是瞭解的。而反向 Proxy則正好相反,服務端會盡量將真實的資源來源(被Proxy 伺服器)隱藏起來,而讓用戶端感覺就像這些資源真的就來自於Proxy 伺服器一樣。

反向 Proxy(Reverse Proxy)

httpd同樣允許我們將遠端站台的文檔放到本地網站的URL空間中。這種技術叫做反向 Proxy(reverse proxying)。這是因為web伺服器會像Proxy 伺服器那樣從遠程伺服器中抓取文檔並將它們響應到用戶端。 但是它與普通代理(normal(forward) proxy)不同的是,反向 Proxy會讓這些遠程文檔看起來就像是來源自反向 Proxy伺服器自身中一樣,換句話說也就是隱藏了這些文檔的真實來源。

在下面的例子中,當用戶端請求位於/foo/目錄下面的文檔時, 反向 Proxy伺服器會從internal.example.com的/bar/目錄下面抓取文檔並返回給用戶端,對用戶端來講,這些文檔就像是來自反向 Proxy伺服器一樣。

ProxyPass "/foo/" "http://internal.example.com/bar/"
ProxyPassReverse "/foo/" "http://internal.example.com/bar/"
ProxyPassReverseCookieDomain internal.example.com public.example.com
ProxyPassReverseCookiePath "/foo/" "/bar/"

ProxyPass指令會讓反向 Proxy伺服器去遠端站台抓取文檔(注釋:實際上僅僅配置這個指令就可以達到最基本的代理)。
ProxyPassReverse 指令會讓httpd調整在Location, Content-Location和URI 頭資訊中的URL,也就是將被代理網站發出的響應中的這三個頭資訊中的URL內容替換為反向 Proxy網站。
ProxyPassReverseCookieDomain 調整set-cookie頭資訊中的domain內容。
ProxyPassReverseCookiePath 調整set-cookie頭資訊中的path內容。

非常值得注意的是: 在被代理的文檔中的連結並不會被重寫。所以任何絕對路徑的連結最終還是會請求到被代理服務中去。更多相關的內容可以參考mod_substitute.和mod_proxy_html

注釋: 說說我對正向 Proxy的理解,比如我們無法直接存取外網,需要通過Proxy 伺服器來訪問,那麼用戶端實際上會先將請求發送給代理,然後代理可能會再去訪問請求中的目標,並將真實目標的響應回傳到用戶端,也可能利用自身的緩衝(cache)直接響應給用戶端。 無論哪種方式,用戶端並不會意識到代理的存在,它會認為我請求的是網站a,那麼我得到的響應同樣來自單點a。我們在瀏覽器中配置的網路代理程式其實就是正向 Proxy。

 

 

Apache HTTP Server 映射URL到檔案系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.