Apache-2.2

創建虛擬主機時,Apache 主伺服器不作為 httpd.conf 中所述的預設值 - 為什麼?

  • April 5, 2016

設置 Apache 伺服器時,主伺服器部分說明以下內容:

# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition.  These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#

但是一旦創建了虛擬主機,伺服器就不再響應了。

如何讓主伺服器將這些頁面作為上面所說的預設伺服器提供服務?

多年來,我經常收到這個問題,當我試圖向一些客戶解釋這一點時,他們有時會與我爭論這一點,因為它確實出現了(實際上可能會強調 - 這有點模棱兩可關於),應該為主伺服器提供所有這些配置作為它自己的配置,並為所有後續虛擬主機設置這些預設值。

正因為如此,我經常在 httpd.conf 文件中包含以下內容,就在主伺服器部分開始的位置下方,以及我支持的各種客戶門戶的知識庫文章中。這有助於減少(一點)VPS 客戶的支持票的數量,這些客戶在嘗試在其 httpd 伺服器上配置對虛擬主機的支持時最終會拉出他們的頭髮:

#                       I know it says above that the main server responds
#                       to ANY requests that aren't handled by a <VirtualHost>
#                       definition - but THIS IS NOT TRUE!!!
#
#                       As you can see below, the "Main Server Goes Away"...
#
#                       From: https://httpd.apache.org/docs/current/vhosts/name-based.html#defaultvhost
#                       (Note that there is no mention in the official Apache docs recommending the
#                       use of a _default_ directive in the <VirtualHost> tag. Hm....
#
# Main host goes away
#
# Any request that doesn't match an existing <VirtualHost> is handled by the
#global server configuration, regardless of the hostname or ServerName.
#
# When you add a name-based virtual host to an existing server, and the virtual
# host arguments match preexisting IP and port combinations, requests will now
# be handled by an explicit virtual host. In this case, it's usually wise to
# create a default virtual host with a ServerName matching that of the base server.
#
# OBSERVATION:  Wise? It's wise? earlier docs (i.e., Apache 2.2 docs) don't put
# it that way - you must, if you want the 'Main Server' to be served.
# Again, _default_ is not mentioned because it should be, and is, only used for a 
# default server in IP based virtual hosting, as clarified here:
# https://serverfault.com/questions/567320/difference-between-default-and-in-virtualhost-context
#
# <Virtualhost _default_:*> with Servername foo.com : should not be used with name based virtualhosting
#
#               You may proceed now - i.e., You now can haz cheezburgerz!

因此,為了澄清和總結,您可能會注意到一些預設/原始 conf 文件在 VirtualHost 標記中定義了“預設”,但這些僅適用於基於 IP 的虛擬主機 - 這就是為什麼 2.4 文件沒有提及這在基於名稱的虛擬主機文件中,所以你不會錯過任何東西,它與基於名稱的虛擬主機無關。

您可能會想,由於“主主機消失”,當您在第一個 VirtualHost 容器的上下文中再次為其複制部分或全部指令時,您將收到有關重複的錯誤 - 但您不會,這是完全合法的,並且期望您將或可能複制它來創建第一個(並且由於是第一個,也是“預設”)虛擬主機。您的 conf 文件中的其他重複項將導致伺服器引發投訴,但在此特定和特殊情況下不會。

所以你可能會問自己:

“既然我創建了虛擬主機容器,那麼主伺服器的所有預設值呢?我還需要重新指定這些嗎?”

你不可以。httpd.conf 中的“主伺服器”和其他指令的這些特定方面實際上已配置並設置為您創建的任何後續虛擬主機的預設值 - 只有主伺服器本身(伺服器管理員、伺服器名稱等)需要在 VirtualHost 容器的上下文中重申和定義。

它本來可以在 httpd.conf 的包含的評論中得到更好的澄清,但事實並非如此,而且至少看起來具有誤導性 - 所以不,你不是瘋了,伺服器應該以這種方式響應。

為方便起見,以下是上面註釋程式碼塊中包含的連結:

主伺服器消失(Apache 2.4 文件): https ://httpd.apache.org/docs/current/vhosts/name-based.html#defaultvhost

預設”伺服器 - 基於名稱和基於 IP 的虛擬伺服器之間的使用說明 :VirtualHost 上下文中 default:* 和 : 之間的區別

我希望這個問答對一些人有所幫助,因為在上述概念變得清晰之前確實需要對 Apache 文件進行一些探勘 - 但我應該注意,系統管理員在 httpd.conf 文件的開頭就被警告了到 rtfm 而不是在了解每個設置的作用之前開始在該文件中配置內容;)

享受!

引用自:https://serverfault.com/questions/768383