目录搜索
首页版本说明从1.3升级到2.0编译时配置的改变运行时配置的改变杂项变化第三方模块从 2.0 升级到 2.2编译时配置的改变运行时配置的改变杂项变化第三方模块Apache 2.1/2.2 版本的新特性核心增强模块增强程序增强针对模块开发者的变化Apache 2.0 版本的新特性核心的增强模块的增强Apache许可证参考手册编译与安装针对心急者的概述要求下载解压配置源代码树编译安装配置测试升级启动Apache是怎样启动的启动时发生错误随系统启动时启动额外信息停止与重新启动简介立即停止优雅重启立即重启优雅停止附录:信号和竞争条件运行时配置指令主配置文件配置文件的语法模块指令的作用域.htaccess文件配置段配置段(容器)的类型文件系统和网络空间虚拟主机代理允许使用哪些指令?配置段的合并内容缓冲简介缓冲概述安全方面的考虑文件句柄缓冲内存缓冲磁盘缓冲服务器全局配置服务器标识文件定位限制资源的使用日志文件安全警告错误日志访问日志日志滚动管道日志虚拟主机其他日志文件从URL到文件系统的映射相关模块和指令DocumentRootDocumentRoot以外的文件用户目录URL重定向反向代理重写引擎File Not Found安全方面的提示保持不断更新和升级ServerRoot目录的权限服务器端包含关于CGI未指定为脚本的CGI指定为脚本的CGI其他动态内容的来源系统设置的保护默认配置下服务器文件的保护观察日志文件动态共享对象(DSO)实现用法概要背景知识优点和缺点内容协商关于内容协商Apache中的内容协商协商的方法打乱品质值透明内容协商的扩展超链和名称转换说明缓冲说明更多信息自定义错误响应行为配置自定义错误响应与重定向地址和端口绑定概述针对IPv6的特殊考虑怎样与虚拟主机协同工作多路处理模块(MPM)简介选择一个MPM默认的MPM环境变量设置环境变量使用环境变量用于特殊目的的环境变量示例处理器的使用什么是处理器?例子程序员注意事项过滤器Apache2中的过滤器智能过虑使用过滤器CGI脚本的Suexec执行开始之前suEXEC的安全模型配置和安装suEXEC启用和禁用suEXEC使用suEXEC调试suEXEC谨防Jabberwock:警告和举例性能调整硬件和操作系统运行时的配置编译时的配置附录:踪迹的详细分析URL重写指南mod_rewrite简介实践方案URL的规划内容的处理对访问的限制其他虚拟主机文档总述虚拟主机支持配置指令基于主机名的虚拟主机基于域名的虚拟主机和基于IP的虚拟主机比较使用基于域名的虚拟主机与旧版浏览器的兼容性基于IP地址的虚拟主机系统需求如何配置Apache设置多个守护进程配置拥有多个虚拟主机的单一守护进程动态配置大量虚拟主机动机概述简单的动态虚拟主机一个实际的个人主页系统在同一个服务器上架设多个主机的虚拟系统更为有效的基于IP地址的虚拟主机使用老版本的Apache使用mod_rewrite实现简单的动态虚拟主机使用mod_rewrite的个人主页系统使用独立的虚拟主机配置文件虚拟主机的普通配置示例在一个IP地址上运行多个基于域名的web站点在多于一个IP的情况下使用基于域名的虚拟主机在不同的IP的地址(比如一个内部和一个外部地址)上提供相同的内容在不同的端口上运行不同的站点建立基于IP的虚拟主机混用基于端口和基于IP的虚拟主机混用基于域名和基于IP的虚拟主机将虚拟主机和代理模块一起使用使用默认虚拟主机将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机使用ServerPath指令深入讨论虚拟主机的匹配解析配置文件虚拟主机匹配小技巧文件描述符限制关于DNS和Apache一个简单示例拒绝服务"主服务器"地址避免这些问题的小技巧附录:进一步的提示常见问题概述SSL/TLS 加密概述文档mod_ssl绪论密码技术证书安全套接字层(SSL)参考兼容性配置指令环境变量自定义日志功能如何...加密方案和强制性高等级安全客户认证和访问控制常见问题解答About The ModuleInstallationConfigurationCertificatesThe SSL Protocolmod_ssl Support如何.../指南概述认证相关模块和指令简介先决条件启用认证允许多人访问可能存在的问题其他认证方法更多信息CGI动态页面简介配置Apache以允许CGI编写CGI程序程序还是不能运行!幕后是怎样操作的?CGI模块/库更多信息服务器端包含简介什么是SSI?配置服务器以允许SSI基本SSI指令附加的例子我还能设置其它什么?执行命令高级SSI技术总结.htaccess文件.htaccess文件工作原理和使用方法(不)使用.htaccess文件的场合指令的生效认证举例服务器端包含(SSI)举例CGI举例疑难解答用户网站目录用户网站目录用UserDir设置文件路径限定哪些用户可以使用此功能启用对每个用户都有效的cgi目录允许用户改变配置对特定平台的说明概述Microsoft Windows其他平台在Microsoft Windows中使用Apache对操作系统的要求下载 Apache for Windows安装 Apache for Windows配置 Apache for Windows以服务方式运行 Apache for Windows作为控制台程序运行Apache测试安装编译Windows下的Apache系统要求命令行编译Developer Studio集成开发环境的工作区编译项目组件在Novell NetWare平台上使用ApacheRequirementsDownloading Apache for NetWareInstalling Apache for NetWareRunning Apache for NetWareConfiguring Apache for NetWareCompiling Apache for NetWare在HP-UX中运行ApacheThe Apache EBCDIC PortOverview of the Apache EBCDIC PortDesign GoalsTechnical SolutionPorting NotesDocument Storage NotesApache Modules' StatusThird Party Modules' Status服务器与支持程序概述httpd语法选项ab语法选项Bugsapachectl语法选项apxs语法选项举例configure语法选项环境变量dbmmanage语法选项Bugshtcacheclean语法选项返回值htdbm语法选项Bugs返回值举例安全方面的考虑限制htdigest语法选项htpasswd语法选项返回值举例安全方面的考虑限制logresolve语法选项rotatelogs语法选项Portabilitysuexec语法选项其他程序log_server_statussplit-logfile杂项文档概述相关标准HTTP推荐标准HTML推荐标准认证语言/国家代码Apache 模块描述模块的术语说明状态源代码文件模块标识符兼容性描述指令的术语说明语法默认值(Default)作用域(Context)覆盖项(Override)状态模块(Module)兼容性(Compatibility)Apache核心(Core)特性AcceptFilterAcceptPathInfoAccessFileNameAddDefaultCharsetAddOutputFilterByTypeAllowEncodedSlashesAllowOverrideAuthNameAuthTypeCGIMapExtensionContentDigestDefaultType<Directory><DirectoryMatch>DocumentRootEnableMMAPEnableSendfileErrorDocumentErrorLogFileETag<Files><FilesMatch>ForceTypeHostnameLookups<IfDefine><IfModule>IncludeKeepAliveKeepAliveTimeout<Limit><LimitExcept>LimitInternalRecursionLimitRequestBodyLimitRequestFieldsLimitRequestFieldSizeLimitRequestLineLimitXMLRequestBody<Location><LocationMatch>LogLevelMaxKeepAliveRequestsNameVirtualHostOptionsRequireRLimitCPURLimitMEMRLimitNPROCSatisfyScriptInterpreterSourceServerAdminServerAliasServerNameServerPathServerRootServerSignatureServerTokensSetHandlerSetInputFilterSetOutputFilterTimeOutTraceEnableUseCanonicalNameUseCanonicalPhysicalPort<VirtualHost>Apache MPM 公共指令AcceptMutexCoreDumpDirectoryEnableExceptionHookGracefulShutdownTimeoutGroupListenListenBackLogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersStartThreadsThreadLimitThreadsPerChildThreadStackSizeUserApache MPM beosMaxRequestsPerThreadCoreDumpDirectoryGroupListenListenBacklogMaxClientsMaxMemFreeMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeStartThreadsUserApache MPM eventAcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileScoreBoardFileSendBufferSizeServerLimitStartServersThreadLimitThreadsPerChildThreadStackSizeUserApache MPM netwareMaxThreadsListenListenBacklogMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsReceiveBufferSizeSendBufferSizeStartThreadsThreadStackSizeApache MPM os2GroupListenListenBacklogMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeSendBufferSizeStartServersUserApache MPM prefork工作方式MaxSpareServersMinSpareServersAcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersUserApache MPM winntWin32DisableAcceptExCoreDumpDirectoryListenListenBacklogMaxMemFreeMaxRequestsPerChildPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeThreadLimitThreadsPerChildThreadStackSizeApache MPM worker工作方式AcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersThreadLimitThreadsPerChildThreadStackSizeUserApache Module mod_actionsAction指令Script指令Apache Module mod_alias处理顺序AliasAliasMatchRedirectRedirectMatchRedirectPermanentRedirectTempScriptAliasScriptAliasMatchApache Module mod_asis用法Apache Module mod_auth_basicAuthBasicAuthoritativeAuthBasicProviderApache Module mod_auth_digest使用摘要认证配合 MS Internet Explorer 6 工作AuthDigestAlgorithmAuthDigestDomainAuthDigestNcCheckAuthDigestNonceFormatAuthDigestNonceLifetimeAuthDigestProviderAuthDigestQopAuthDigestShmemSizeApache Module mod_authn_alias示例<AuthnProviderAlias>Apache Module mod_authn_anon示例AnonymousAnonymous_LogEmailAnonymous_MustGiveEmailAnonymous_NoUserIDAnonymous_VerifyEmailApache Module mod_authn_dbd配置示例AuthDBDUserPWQueryAuthDBDUserRealmQueryApache Module mod_authn_dbmAuthDBMTypeAuthDBMUserFileApache Module mod_authn_defaultAuthDefaultAuthoritativeApache Module mod_authn_fileAuthUserFileApache Module mod_authnz_ldapContentsOperationThe require Directives举例Using TLSUsing SSLUsing Microsoft FrontPage with mod_authnz_ldapAuthLDAPBindDNAuthLDAPBindPasswordAuthLDAPCharsetConfigAuthLDAPCompareDNOnServerAuthLDAPDereferenceAliasesAuthLDAPGroupAttributeAuthLDAPGroupAttributeIsDNAuthLDAPRemoteUserIsDNAuthLDAPUrlAuthzLDAPAuthoritativeApache Module mod_authz_dbmAuthDBMGroupFileAuthzDBMAuthoritativeAuthzDBMTypeApache Module mod_authz_defaultAuthzDefaultAuthoritativeApache Module mod_authz_groupfileAuthGroupFileAuthzGroupFileAuthoritativeApache Module mod_authz_hostAllowDenyOrderApache Module mod_authz_owner配置示例AuthzOwnerAuthoritativeApache Module mod_authz_userAuthzUserAuthoritativeApache Module mod_autoindexAutoindex Request Query ArgumentsAddAltAddAltByEncodingAddAltByTypeAddDescriptionAddIconAddIconByEncodingAddIconByTypeDefaultIconHeaderNameIndexIgnoreIndexOptionsIndexOrderDefaultIndexStyleSheetReadmeNameApache Module mod_cacheRelated Modules and Directives配置示例CacheDefaultExpireCacheDisableCacheEnableCacheIgnoreCacheControlCacheIgnoreHeadersCacheIgnoreNoLastModCacheLastModifiedFactorCacheMaxExpireCacheStoreNoStoreCacheStorePrivateApache Module mod_cern_metaMetaDirMetaFilesMetaSuffixApache Module mod_cgiCGI 环境变量CGI 脚本的调试ScriptLogScriptLogBufferScriptLogLengthApache Module mod_cgidScriptSockScriptLogScriptLogBufferScriptLogLengthApache Module mod_charset_liteCommon ProblemsCharsetDefaultCharsetOptionsCharsetSourceEncApache Module mod_davEnabling WebDAVSecurity IssuesComplex ConfigurationsDavDavDepthInfinityDavMinTimeoutApache Module mod_dav_fsDavLockDBApache Module mod_dav_lockDavGenericLockDBApache Module mod_dbdConnection PoolingApache DBD APISQL Prepared StatementsDBDExptimeDBDKeepDBDMaxDBDMinDBDParamsDBDPersistDBDPrepareSQLDBDriverApache Module mod_deflate配置举例启用压缩代理服务器DeflateBufferSizeDeflateCompressionLevelDeflateFilterNoteDeflateMemLevelDeflateWindowSizeApache Module mod_dirDirectoryIndexDirectorySlashApache Module mod_disk_cacheCacheDirLengthCacheDirLevelsCacheMaxFileSizeCacheMinFileSizeCacheRootApache Module mod_dumpio启用dumpio支持DumpIOInputDumpIOOutputApache Module mod_echoProtocolEchoApache Module mod_envPassEnvSetEnvUnsetEnvApache Module mod_exampleCompiling the example moduleUsing the mod_example ModuleExampleApache Module mod_expires交替间隔语法ExpiresActiveExpiresByTypeExpiresDefaultApache Module mod_ext_filter举例ExtFilterDefineExtFilterOptionsApache Module mod_file_cacheUsing mod_file_cacheCacheFileMMapFileApache Module mod_filterSmart FilteringFilter DeclarationsConfiguring the ChainExamplesProtocol HandlingFilterChainFilterDeclareFilterProtocolFilterProviderFilterTraceApache Module mod_headers处理顺序前处理和后处理举例HeaderRequestHeaderApache Module mod_identIdentityCheckIdentityCheckTimeoutApache Module mod_imagemapNew FeaturesImagemap FileExample MapfileReferencing your mapfileImapBaseImapDefaultImapMenuApache Module mod_includeEnabling Server-Side IncludesPATH_INFO with Server Side IncludesBasic ElementsInclude VariablesVariable SubstitutionFlow Control ElementsSSIEndTagSSIErrorMsgSSIStartTagSSITimeFormatSSIUndefinedEchoXBitHackApache Module mod_info安全问题选择哪些信息可以被显示已知的局限AddModuleInfoApache Module mod_isapi用法附加注释程序员注记ISAPIAppendLogToErrorsISAPIAppendLogToQueryISAPICacheFileISAPIFakeAsyncISAPILogNotSupportedISAPIReadAheadBufferApache Module mod_ldap示例配置LDAP 连接池LDAP 缓冲使用SSL/TLSSSL/TLS 证书LDAPCacheEntriesLDAPCacheTTLLDAPConnectionTimeoutLDAPOpCacheEntriesLDAPOpCacheTTLLDAPSharedCacheFileLDAPSharedCacheSizeLDAPTrustedClientCertLDAPTrustedGlobalCertLDAPTrustedModeLDAPVerifyServerCertApache Module mod_log_config定制日志文件格式安全考虑BufferedLogsCookieLogCustomLogLogFormatTransferLogApache Module mod_log_forensic定制日志文件格式安全考虑ForensicLogApache Module mod_logio定制日志文件格式Apache Module mod_mem_cacheMCacheMaxObjectCountMCacheMaxObjectSizeMCacheMaxStreamingBufferMCacheMinObjectSizeMCacheRemovalAlgorithmMCacheSizeApache Module mod_mime带多扩展名的文件内容编码字符集和语言AddCharsetAddEncodingAddHandlerAddInputFilterAddLanguageAddOutputFilterAddTypeDefaultLanguageModMimeUsePathInfoMultiviewsMatchRemoveCharsetRemoveEncodingRemoveHandlerRemoveInputFilterRemoveLanguageRemoveOutputFilterRemoveTypeTypesConfigApache Module mod_mime_magic"Magic文件"的格式性能问题注意MimeMagicFileApache Module mod_negotiation类型表MultiViewsCacheNegotiatedDocsForceLanguagePriorityLanguagePriorityApache Module mod_nw_sslNWSSLTrustedCertsNWSSLUpgradeableSecureListenApache Module mod_proxy正向和反向代理简单示例控制对代理服务器的访问缓慢启动局域网代理协议调整请求体AllowCONNECTNoProxy<Proxy>ProxyBadHeaderProxyBlockProxyDomainProxyErrorOverrideProxyIOBufferSize<ProxyMatch>ProxyMaxForwardsProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePathProxyPreserveHostProxyReceiveBufferSizeProxyRemoteProxyRemoteMatchProxyRequestsProxyTimeoutProxyViaApache Module mod_proxy_ajpOverview of the protocolBasic Packet StructureRequest Packet StructureResponse Packet StructureApache Module mod_proxy_balancerLoad balancer scheduler algorithmRequest Counting AlgorithmWeighted Traffic Counting AlgorithmEnabling Balancer Manager SupportApache Module mod_proxy_connectApache Module mod_proxy_ftp为什么xxx类型的文件不能从FTP下载?如何强制文件xxx使用FTP的ASCII形式下载?我如何使用FTP上传?我如何能访问我自己home目录以外的FTP文件?我如何才能在浏览器的URL框中隐藏FTP的明文密码?Apache Module mod_proxy_httpApache Module mod_rewrite特殊字符的引用环境变量实用方案RewriteBaseRewriteCondRewriteEngineRewriteLockRewriteLogRewriteLogLevelRewriteMapRewriteOptionsRewriteRuleApache Module mod_setenvifBrowserMatchBrowserMatchNoCaseSetEnvIfSetEnvIfNoCaseApache Module mod_so为Windows创建可加载模块LoadFileLoadModuleApache Module mod_spelingCheckSpellingApache Module mod_ssl环境变量Custom Log FormatsSSLCACertificateFileSSLCACertificatePathSSLCADNRequestFileSSLCADNRequestPathSSLCARevocationFileSSLCARevocationPathSSLCertificateChainFileSSLCertificateFileSSLCertificateKeyFileSSLCipherSuiteSSLCryptoDeviceSSLEngineSSLHonorCipherOrderSSLMutexSSLOptionsSSLPassPhraseDialogSSLProtocolSSLProxyCACertificateFileSSLProxyCACertificatePathSSLProxyCARevocationFileSSLProxyCARevocationPathSSLProxyCipherSuiteSSLProxyEngineSSLProxyMachineCertificateFileSSLProxyMachineCertificatePathSSLProxyProtocolSSLProxyVerifySSLProxyVerifyDepthSSLRandomSeedSSLRequireSSLRequireSSLSSLSessionCacheSSLSessionCacheTimeoutSSLUserNameSSLVerifyClientSSLVerifyDepthApache Module mod_statusEnabling Status Support自动更新Machine Readable Status FileExtendedStatusApache Module mod_suexecSuexecUserGroupApache Module mod_unique_idTheoryApache Module mod_userdirUserDirApache Module mod_usertrackLogging2-digit or 4-digit dates for cookies?CookieDomainCookieExpiresCookieNameCookieStyleCookieTrackingApache Module mod_version<IfVersion>Apache Module mod_vhost_alias目录名称的转换示例VirtualDocumentRootVirtualDocumentRootIPVirtualScriptAliasVirtualScriptAliasIP开发者文档OverviewTopicsExternal ResourcesApache API notesBasic conceptsHow handlers workResource allocation and resource poolsConfigurationDebugging Memory Allocation in APRAvailable debugging optionsAllowable CombinationsActivating Debugging OptionsDocumenting Apache 2.0Apache 2.0 Hook FunctionsCreating a hook functionHooking the hookConverting Modules from Apache 1.3 to Apache 2.0The easier changes ...The messier changes...Request Processing in Apache 2.0The Request Processing CycleThe Request Parsing PhaseThe Security PhaseThe Preparation PhaseThe Handler PhaseHow Filters Work in Apache 2.0Filter TypesHow are filters inserted?AsisExplanations词汇和索引词汇表模块索引指令索引指令速查译者声明
文字

深入研究虚拟主机的匹配

虚拟主机部分的代码在Apache 1.3中进行了完全的重写。本文档试图详细解释Apache在接受到请求后如何确定使用哪一个虚拟主机进行伺服。在新的NameVirtualHost指令的帮助下,虚拟主机的配置比1.3版以前更加简单和安全。

如果您只是想让它能够工作而不愿意进行深入理解,这里有一些示例。

解析配置文件

<VirtualHost>配置段外有一个主服务器(main_server)段中包含着所有定义。其中有<VirtualHost>配置段中定义的叫做虚拟主机(vhost)的虚拟服务器。

Listen, ServerName, ServerPath, ServerAlias指令可以出现在一个服务器定义段的任何地方。而且每个指令都会覆盖前面出现的同样定义(在那个服务器配置中)。

主服务器段中Listen指令的默认值是80。主服务器段没有默认的ServerPathServerAlias指令值。ServerName的默认值是由服务器的IP地址推断而来。

主服务器的Listen指令有两个功能:其一是决定Apache将要绑定的网络端口;其二是在重定向中指定绝对URI将使用的端口号。

不象在主服务器里,虚拟服务器的端口不会影响到Apache的监听端口。

每个VirtualHost指令中的地址都可以附带一个可选的端口。如果没有进行特别的指定,这个端口默认为主服务器中最近的一个Listen指令指定的值。特殊的端口"*"表示匹配所有端口。所有这一系列地址(包括由DNS查询出的所有A记录)统称虚拟主机的地址集(address set)

如果没有对一个特定的IP地址使用NameVirtualHost指令,那么第一个使用这个地址的虚拟主机将被视为基于IP的虚拟主机。IP地址也可以用通配符"*"表示。

如果使用了基于域名的虚拟主机,那么必须NameVirtualHost指令为这个基于域名的虚拟主机指定IP地址集。换句话说,您必须在配置文件中通过NameVirtualHost指令指定包括主机名映射(CNAME)的IP地址。

可以使用很多NameVirtualHost指令来分别对应一套NameVirtualHost指令,但对于每个特定的"IP:port"对来说,只能使用一次NameVirtualHost指令。

NameVirtualHostVirtualHost指令出现的顺序并不重要。只有对应同一个IP地址的VirtualHost指令的次序才是重要的。所以下面两例所起的作用是完全相同的:

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
# server A
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>

NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

<VirtualHost 111.22.33.44>
# server A
</VirtualHost>
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

NameVirtualHost 111.22.33.44
NameVirtualHost 111.22.33.55

(为了使您的配置文件更具可读性,我们推荐您使用左边的格式)

在解析完VirtualHost指令后,虚拟主机服务器将被赋予在它的VirtualHost指令中第一个名字对应的端口作为默认的Listen端口。

如果所有域名都指向同一个地址集的话,VirtualHost指令中的所有域名列表都将会得到和ServerAlias指令一样的处理(但不会被其他ServerAlias语句覆盖)。请注意,这个虚拟主机自带的Listen指令将不能影响到那个地址集的端口号。

在初始化的过程中,将会为每一个IP地址产生一个列表,并插入到一个散列表中。如果这个IP地址是用在一个NameVirtualHost指令中的,这个列表将会包含所有指定为这个IP地址的基于域名的虚拟主机。如果没有虚拟主机针对这个IP地址,那么NameVirtualHost指令将被忽略,并会在日志中记录一个错误信息。对于基于IP的虚拟主机而言,这个散列表中的列表为空。

因为使用了高效的散列算法,使得在请求到达的时候在其中查找IP地址的开销变得很小,或者根本不需考虑。而且这个表格还为只有最后一个八进制位不同的IP地址做了优化。

虚拟主机的每个变量都有初始值。特别是以下这些:

  1. 如果虚拟主机没有ServerAdmin, ResourceConfig, AccessConfig, Timeout, KeepAliveTimeout, KeepAlive, MaxKeepAliveRequests, ReceiveBufferSize, SendBufferSize指令,那么将从主服务器继承它们的值。(也就是说,使用在主服务器中最后出现的设定值)。
  2. 虚拟主机的默认目录权限将继承主服务器的设置(包括所有模块针对每个目录的配置信息)。
  3. 虚拟主机将继承主服务器中每个模块针对主服务器的设置。

本质上,主服务器在建立每个虚拟主机的时候,充当了一个默认值或根基的角色。但这些存在于主服务器中的定义的位置是无关紧要的——主服务器的配置在与虚拟主机整合之前就已经解析过了。所以即使一个主服务器的配置出现在虚拟主机定义的后面,它也同样会影响到虚拟主机的配置。

如果没有定义主服务器中的ServerName ,那么将由运行这个httpd服务的机器的主机名来代替。我们将由DNS查找此ServerName返回的IP地址称为主服务器地址集(main_server address set)

在没有定义ServerName的情况下,一个基于域名的虚拟主机默认采用定义虚拟主机时在VirtualHost指令中最先出现的地址。

所有使用了"_default_"通配符的虚拟主机将被赋予和主服务器相同的ServerName

虚拟主机匹配

服务器用下述方法来确定对一个特定的请求使用哪个虚拟主机:

散列表查找

当客户端第一次连接的时候,会从内部的IP散列表中查找客户端想要连接的IP地址。

如果查找失败(没有找到相应的IP地址),而所请求的端口又存在一个"_default_"虚拟主机,那么这个请求将会由这个虚拟主机来伺服。如果没有找到这样的"_default_"虚拟主机,那么这个请求将会由主服务器来伺服。

如果在散列表中没有找到IP地址,但存在一个"NameVirtualHost *"指令与所请求的端口号相匹配,那么将用这个虚拟主机来处理这个请求。

如果查找成功(找到了对应于这个IP地址的列表),下一步就是看我们要处理的是一个基于IP的虚拟主机还是一个基于域名的虚拟主机。

基于IP的虚拟主机

如果返回的列表中域名列表为空,那么我们处理的就是一个基于IP的虚拟主机,这个虚拟主机将会直接进行处理而不会有其他步骤。

基于域名的虚拟主机

如果返回的域名列表包含一个或多个虚拟主机的结构,那么我们处理的就是一个基于域名的虚拟主机。这个列表包含的虚拟主机的顺序与配置文件中相应VirtualHost指令出现的顺序是相同的。

这个列表中第一个虚拟主机(也就是在配置文件中第一个指定了这个IP地址的虚拟主机)对处理请求有着最高的优先级。所有对未知服务器名或没有"Host:"头的请求都将由它进行处理。

如果客户端在请求中提供了一个"Host:"头,那么将在列表中查找第一个ServerNameServerAlias与其符合的虚拟主机,并将其用于伺服这个请求。尽管"Host:"头中可以包含端口号,但Apache还是会用收到请求的那个真实端口来进行匹配。

如果客户端提交了一个不包含"Host:"头的HTTP/1.0的请求,我们将无法确认客户端想要连接那个服务器。而如果存在一个ServerPath与客户端提交的请求中的URI相对应,那么列表中第一个符合条件的虚拟主机将用于伺服这个请求。

如果还是找不到对应的虚拟主机,那么这个请求将会由客户端连接的IP对应的列表中的第一个与请求的端口相同的虚拟主机来伺服(如前所述)。

持久连接

上述IP查找对一个特定的TCP/IP进程只执行一次。但在持久连接(KeepAlive)中,每个请求都会进行一次这样的查找过程。换句话说,一个客户端在一个持久连接中可以向位于不同的基于域名的虚拟主机的页面提出请求。

绝对URI

如果请求提交的URI是一个绝对URI,而其中的主机名和端口号又和主服务器或某个虚拟主机相符合,并且也与作为此请求提交对象的地址和端口相符,那么这个请求的类型/主机名/端口前缀将被抹除,仅留下相对URI为对应的主服务器或虚拟主机所伺服。如果不满足上述符合条件,这个URI将保留原样,而此请求将被作为一个代理请求处理。

备忘录

  • 基于域名的虚拟主机和基于IP的虚拟主机之间互相不干扰。基于IP的虚拟主机只接受发送到它自身地址集的请求,而不接受其他IP地址。基于域名的虚拟主机也是一样,它们只接受NameVirtualHost指令定义的地址集的访问。
  • 永远不会对一个基于IP的虚拟主机执行ServerAliasServerPath检查。
  • 在配置文件中,基于域名的虚拟主机、基于IP的虚拟主机、"_default_"虚拟主机和NameVirtualHost指令出现的顺序并不重要。而对于某个指定的地址集来说,基于域名的虚拟主机的顺序是不能混淆的:在配置文件中较先出现的虚拟主机在相应的地址集中有较高的优先权。
  • 出于安全性的考虑,在"Host:"头中出现的端口号将不用于匹配。Apache会一直使用客户端所连接的真实端口作为匹配。
  • 如果一个ServerPath指令凑巧是后面出现的另外一个ServerPath指令的前缀,前者将用于匹配,而后者将被忽略。(这里讨论的是没有"Host:"头来将这两个情况分开的情况下)
  • 如果有两个基于IP的虚拟主机使用了同一个地址,则在配置文件中首先出现的那个用于匹配。这种事情可能发生在你疏忽的时候。当服务器遇到这种情况的时候,会在日志文件中写入一个错误信息。
  • 仅当没有其他虚拟主机符合客户端请求的IP地址和端口号时,"_default_"虚拟主机才会捕获这个请求。并且仅当"_default_"虚拟主机的端口号(默认值由您的Listen指定)与客户端发送请求的目的端口号相符时,这个请求才会被捕获。也可以使用通配符(例如:"_default_:*")来捕获任何端口号的请求。这也同样适用于"NameVirtualHost *"的虚拟主机。
  • 仅当客户端连接的目的IP地址和端口号没有指定而且不与任何一个虚拟主机(包括"_default_"虚拟主机)匹配的时候,才会用主服务器来伺服请求。换句话说,主服务器仅捕获没有指定IP地址和端口的请求(除非存在一个匹配端口的"_default_"虚拟主机)。
  • 如果客户端连接到一个用于基于域名的虚拟主机使用的地址(和端口),比如说使用了NameVirtualHost指令,那么一个未知的或没有"Host:"头的请求就不会与"_default_"虚拟主机或是主服务器相匹配。
  • 绝对不能在VirtualHost指令中使用DNS名称,否则您的服务器就会依赖DNS来进行启动。而且,如果您无法控制列表中所有的域,您将会面临安全威胁。您可以在这里获得关于这个问题和以下两个问题的更多详情。
  • 应当为每个虚拟主机设定ServerName 。否则就会需要为每个虚拟主机进行DNS查询。

小技巧

作为DNS问题页面小技巧的附加,这里有些额外的技巧:

  • 将所有主服务器的定义放在所有VirtualHost定义之前(为了增加可读性),否则会使得类似在虚拟主机旁边的定义影响到所有的虚拟主机这样的问题不容易发现。
  • 将您配置中相应的NameVirtualHostVirtualHost定义放到一起,以获得更好的可读性。
  • 避免前一个ServerPaths是后一个ServerPaths的前缀。如果您无法避免这样的情况,您最好确保在您的配置文件中"长在前,短在后"(也就是说:"ServerPath/abc/def"应当出现在"ServerPath/abc"之前)。
上一篇:下一篇: