<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 虛擬主機示例 本文檔試圖解釋一些在設置虛擬主機時經常問及的問題。這些示例向你展示了如何在一個服務器上通過[基于域名](#calibre_link-75)的或是[基于IP](#calibre_link-653)的虛擬主機來部署多個web站點。另一份關于如何在一個代理服務器后構建基于多個服務器的站點的說明文檔也很快就會出來。 ## 在一個IP地址上運行多個基于域名的web站點 您的服務器有只一個IP地址,而在DNS中有很多域名(CNAMES)映射到這個機器。您而您想要在這個機器上運行`www.example.com`和`www.example.org`兩個站點。 ### 注意 在您的Apache服務器配置中創建一個虛擬主機并不會自動在您的DNS中對主機名做相應更新。您_必須_自己在DNS中添加域名來指向您的IP地址。否則別人是無法看到您的web站點的。您可以在您的`hosts`文件中添加這一條目來進行測試,但這種方法僅適用于那些有這些`hosts`文件的機器來使用。 ### 服務器配置 ``` # 確保Apache在監聽80端口 Listen 80 # 為虛擬主機在所有IP地址上監聽 NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /www/example1 ServerName www.example.com # 你可以在這里添加其他指令 </VirtualHost> <VirtualHost *:80> DocumentRoot /www/example2 ServerName www.example.org # 你可以在這里添加其他指令 </VirtualHost> ``` 因為星號匹配所有IP地址,所以主服務器不接收任何請求。因為`www.example.com`首先出現在配置文件中,所以它擁有最高優先級,可以認為是&lt;cite class="calibre27"&gt;默認&lt;/cite&gt;或&lt;cite class="calibre27"&gt;主&lt;/cite&gt;服務器。這意味著如果一個請求不能與某個`ServerName`指令相匹配,它將會由第一個`<VirtualHost>`段所伺服。 ### 注意 如果您愿意,您可以用確定的IP地址來取代"`*`"。在這種情況下,`VirtualHost`的參數_必須_與`NameVirtualHost`的參數相符: ``` NameVirtualHost 172.20.30.40 <VirtualHost 172.20.30.40> # 其他 ... ``` 然而,當您的IP地址無法確定的時候,使用"`*`"是很方便的,比如說,您的ISP給您配置的是動態IP地址,而您又使用了某種動態域名解析系統時。因為"`*`"匹配任何IP地址,所以在這種情況下,不論IP地址如何變化,您都不需要另外進行配置。 上述配置就是您在絕大多數情況下使用基于域名的虛擬主機時將要用到的。事實上,僅在一種情況下這樣的配置不會讓您滿意:您想為不同的IP地址或是端口提供不同的內容。 ## 在多于一個IP的情況下使用基于域名的虛擬主機。 ### 注意 在這里討論的任何技術都可以推廣到使用任意數量的IP地址。 服務器有兩個IP地址。一個(`172.20.30.40`)用于主服務器`server.domain.com` ,另外一個(`172.20.30.50`)用于構建兩個或多個虛擬主機。 ### 服務器配置 ``` Listen 80 # "主"服務器運行于:172.20.30.40 ServerName server.domain.com DocumentRoot /www/mainserver # 這是另外一個IP地址 NameVirtualHost 172.20.30.50 <VirtualHost 172.20.30.50> DocumentRoot /www/example1 ServerName www.example.com # 你可以在這里添加其他指令 ... </VirtualHost> <VirtualHost 172.20.30.50> DocumentRoot /www/example2 ServerName www.example.org # 你可以在這里添加其他指令 ... </VirtualHost> ``` 任何不是針對`172.20.30.50`的請求都將由主服務器來伺服。而提交給`172.20.30.50`卻沒有主機名或沒有"`Host:`"頭的請求,都將由`www.example.com`伺服。 ## 在不同的IP的地址(比如一個內部和一個外部地址)上提供相同的內容 服務器有兩個IP地址(`192.168.1.1`和`172.20.30.40`)。這個機器位于內部(局域網)網絡和外部(廣域網)之間。在外部,域名`server.example.com`指向外部地址(`172.20.30.40`),而在內部則指向內部地址(`192.168.1.1`)。 服務器可以為來自內部和外部的請求提供同樣的內容,您只需要一個`<VirtualHost>`配置段就可以了。 ### 服務器配置 ``` NameVirtualHost 192.168.1.1 NameVirtualHost 172.20.30.40 <VirtualHost 192.168.1.1 172.20.30.40> DocumentRoot /www/server1 ServerName server.example.com ServerAlias server </VirtualHost> ``` 現在,從不同的網絡提交的請求都會由同一個`<VirtualHost>`段來伺服。 ### 注意 在內網中,您可以使用`server`這個名字來代替`server.example.com`這個全名。 跟上面一樣,在上述的例子里,您可以用"`*`"來代替具體的IP地址,這樣就可以對所有的地址都返回相同的內容了。 ## 在不同的端口上運行不同的站點 如果您想讓同一個IP的不同端口伺服多個域名。您可以借助在`NameVirtualHost`指令中定義端口的方法來達到這個目的。如果您想使用不帶"`name:port`"的`<VirtualHost name:port>`或是直接用`Listen`指令,您的配置將無法生效。 ### 服務器配置 ``` Listen 80 Listen 8080 NameVirtualHost 172.20.30.40:80 NameVirtualHost 172.20.30.40:8080 <VirtualHost 172.20.30.40:80> ServerName www.example.com DocumentRoot /www/domain-80 </VirtualHost> <VirtualHost 172.20.30.40:8080> ServerName www.example.com DocumentRoot /www/domain-8080 </VirtualHost> <VirtualHost 172.20.30.40:80> ServerName www.example.org DocumentRoot /www/otherdomain-80 </VirtualHost> <VirtualHost 172.20.30.40:8080> ServerName www.example.org DocumentRoot /www/otherdomain-8080 </VirtualHost> ``` ## 建立基于IP的虛擬主機 一個有兩個IP地址(`172.20.30.40`和`172.20.30.50`)分別對應域名`www.example.com`和`www.example.org`的配置如下: ### 服務器配置 ``` Listen 80 <VirtualHost 172.20.30.40> DocumentRoot /www/example1 ServerName www.example.com </VirtualHost> <VirtualHost 172.20.30.50> DocumentRoot /www/example2 ServerName www.example.org </VirtualHost> ``` 如果存在主服務器,那么對沒有出現在任一個`<VirtualHost>`段中的請求(比如,對`localhost`的請求)都會由主服務器來伺服。 ## 混用基于端口和基于IP的虛擬主機 如果您的服務器有兩個IP地址(`172.20.30.40`和`172.20.30.50`)分別對應域名`www.example.com`和`www.example.org` 。對每個域名,您都希望在80端口和8080端口發布您的網站。您可以這樣配置: ### 服務器配置 ``` Listen 172.20.30.40:80 Listen 172.20.30.40:8080 Listen 172.20.30.50:80 Listen 172.20.30.50:8080 <VirtualHost 172.20.30.40:80> DocumentRoot /www/example1-80 ServerName www.example.com </VirtualHost> <VirtualHost 172.20.30.40:8080> DocumentRoot /www/example1-8080 ServerName www.example.com </VirtualHost> <VirtualHost 172.20.30.50:80> DocumentRoot /www/example2-80 ServerName www.example.org </VirtualHost> <VirtualHost 172.20.30.50:8080> DocumentRoot /www/example2-8080 ServerName www.example.org </VirtualHost> ``` ## 混用基于域名和基于IP的虛擬主機 您想在一些地址上配置基于域名的虛擬主機而在另外一些地址上配置基于IP的虛擬主機。 ### 服務器配置 ``` Listen 80 NameVirtualHost 172.20.30.40 <VirtualHost 172.20.30.40> DocumentRoot /www/example1 ServerName www.example.com </VirtualHost> <VirtualHost 172.20.30.40> DocumentRoot /www/example2 ServerName www.example.org </VirtualHost> <VirtualHost 172.20.30.40> DocumentRoot /www/example3 ServerName www.example3.net </VirtualHost> # IP-based <VirtualHost 172.20.30.50> DocumentRoot /www/example4 ServerName www.example4.edu </VirtualHost> <VirtualHost 172.20.30.60> DocumentRoot /www/example5 ServerName www.example5.gov </VirtualHost> ``` ## 將`<Virtual_host>`和`mod_proxy`模塊一起使用 下面的例子允許一個前端機器代理一個運行在其他機器上的虛擬主機。在如下示例中,在`192.168.111.2`機器上配置了一個同名的虛擬主機。這樣,萬一在同一臺機器上代理了多個主機名,`[ProxyPreserveHost](#calibre_link-670) On` 指令能確保指定的主機名順利通過代理。 ``` <VirtualHost *:*> ProxyPreserveHost On ProxyPass / http://192.168.111.2 ProxyPassReverse / http://192.168.111.2/ ServerName hostname.example.com </VirtualHost> ``` ## 使用"`_default_`"虛擬主機 ### 為所有端口配置"`_default_`"虛擬主機 這樣配置可以捕獲_所有_指向沒指定的IP地址和端口的請求。比如:一個沒被任何虛擬主機使用的地址/端口對。 ### 服務器配置 ``` <VirtualHost _default_:*> DocumentRoot /www/default </VirtualHost> ``` 這樣一個使用通配符端口的默認虛擬主機可以有效的防止請求被主服務器接收。 如果一個地址/端口對已經被一個基于域名的虛擬主機使用,那么"`_default_`"虛擬主機決不會處理發向這個地址/端口對的請求。如果一個"`Host:`"請求頭中包含未知信息,或者干脆就沒有,那么它會被第一個基于域名的虛擬主機(也就是在配置文件中最先出現的使用了那個地址/端口對的虛擬主機)處理。 您可以用`AliasMatch`或`RewriteRule`來重寫任何請求,使它指向一個簡單信息頁面(或腳本)。 ### 為不同的端口配置"`_default_`"虛擬主機 與第一種一樣,但我們想讓服務器偵聽很多端口而第二個"`_default_`"虛擬主機單獨偵聽80端口。 ### 服務器配置 ``` <VirtualHost _default_:80> DocumentRoot /www/default80 # ... </VirtualHost> <VirtualHost _default_:*> DocumentRoot /www/default # ... </VirtualHost> ``` 偵聽80端口的"`_default_`"虛擬主機(_必須_出現在所有使用通配符端口的虛擬主機之前)會捕獲所有發向一個未指定的IP地址的請求。主服務器將不會用于伺服任何請求。 ### 為單獨一個端口配置"`_default_`"虛擬主機 如果我們只想在80端口上建立唯一的一個"`_default_`"虛擬主機,我們應該這樣配置: ### 服務器配置 ``` <VirtualHost _default_:80> DocumentRoot /www/default ... </VirtualHost> ``` 發向一個未指定地址的80端口的請求將會由這個虛擬主機伺服;而發向未設定地址的其他端口的請求則由主服務器伺服。 ## 將一個基于域名的虛擬主機移植為一個基于IP的虛擬主機 如果一個具有`www.example.org`域名的虛擬主機(就是[基于域名](#calibre_link-671)配置示例中的第二個)得到了自己的IP地址。為了避免一些域名服務器或代理服務器在移植期間仍對這個域名做老的解析,我們可以采用一種過渡方法:同時提供新舊兩個IP地址的解析。 達到這個目的很簡單。因為我們只要簡單的把新地址(`172.20.30.50`)加入`VirtualHost`指令就行了。 ### 服務器配置 ``` Listen 80 ServerName www.example.com DocumentRoot /www/example1 NameVirtualHost 172.20.30.40 <VirtualHost 172.20.30.40 172.20.30.50> DocumentRoot /www/example2 ServerName www.example.org # ... </VirtualHost> <VirtualHost 172.20.30.40> DocumentRoot /www/example3 ServerName www.example.net ServerAlias *.example.net # ... </VirtualHost> ``` 現在這個虛擬主機就可以用新地址(表現為一個基于IP的虛擬主機)和舊地址(表現為一個基于域名的虛擬主機)同時進行訪問了。 ## 使用`ServerPath`指令 如果我們在同一個服務器上運行了兩個基于域名的虛擬主機。為了匹配正確的虛擬主機,客戶端必須發送正確的"`Host:`"頭。而舊的使用HTTP/1.0的客戶端無法發送這樣的頭,這樣Apache就無法辨別客戶端想要連接哪個虛擬主機(會用主虛擬主機來伺服這個請求)。為了盡量提供向下兼容性,我們可以提供一個主虛擬主機來返回一個頁面,在頁面中加入指向基于域名的虛擬主機的URL前綴的鏈接。 ### 服務器配置 ``` NameVirtualHost 172.20.30.40 <VirtualHost 172.20.30.40> # 主虛擬主機 DocumentRoot /www/subdomain RewriteEngine On RewriteRule ^/.* /www/subdomain/index.html # ... </VirtualHost> <VirtualHost 172.20.30.40> DocumentRoot /www/subdomain/sub1 ServerName www.sub1.domain.tld ServerPath /sub1/ RewriteEngine On RewriteRule ^(/sub1/.*) /www/subdomain$1 # ... </VirtualHost> <VirtualHost 172.20.30.40> DocumentRoot /www/subdomain/sub2 ServerName www.sub2.domain.tld ServerPath /sub2/ RewriteEngine On RewriteRule ^(/sub2/.*) /www/subdomain$1 # ... </VirtualHost> ``` 由于`ServerPath`指令的作用,發送到`http://www.sub1.domain.tld/sub1/`的請求_總會_被sub1-vhost所伺服。 如果客戶端發送了正確的"`Host:`"頭,發送到`http://www.sub1.domain.tld/`的請求只會被sub1-vhost所伺服。如果沒有發送"`Host:`"頭,客戶端將會得到從主虛擬主機發送的信息頁面。 請注意,這里還有一點小問題:如果客戶端沒有發送"`Host:`"頭,發送到`http://www.sub2.domain.tld/sub1/`的請求還是會被sub1-vhost所伺服。 `RewriteRule`指令用以確保正確發送了"`Host:`"頭的客戶端可以任意使用這兩種URL變量,比如說:使用或不使用URL前綴。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看