配置 Apache httpd 将子域映射到子目录

时间:2021-01-28 06:27:51

标签: apache subdomain

我正在创建多个子域,每次我需要为每个子域创建一个 Apache 配置文件时。是否可以使用单个配置来配置 Apache httpd,以便每个子文件夹对应一个子域?喜欢

subdomain1.example.com -> /var/www/example.com/subdomain1/
subdomain2.example.com -> /var/www/example.com/subdomain2/
whatever.example.com -> /var/www/example.com/whatever/

换句话说,每当我创建一个新文件夹时,我的域名都会有一个新的子域。

1 个答案:

答案 0 :(得分:1)

<块引用>

虚拟主机由两条信息定义:它的 IP 地址,以及 HTTP 请求中 Host: 标头的内容。动态海量虚拟主机技术基于自动将此信息插入到用于满足请求的文件的路径名中。使用 mod_vhost_alias 最容易做到这一点,但如果您使用的 Apache 版本高达 1.3.6,则必须使用 mod_rewrite。默认情况下,这两个模块都是禁用的;如果要使用此技术,则必须在配置和构建 Apache 时启用其中之一。

有几件事需要“伪造”才能使动态虚拟主机看起来像一个正常的虚拟主机。最重要的是 Apache 用来生成自引用 URL 等的服务器名称。它是用 ServerName 指令配置的,CGI 通过 SERVER_NAME 环境变量可以使用它。运行时使用的实际值由 UseCanonicalName 设置控制。使用 UseCanonicalName Off 时,服务器名称来自请求中 Host: 标头的内容。使用 UseCanonicalName DNS,它来自虚拟主机 IP 地址的反向 DNS 查找。前者设置用于基于名称的动态虚拟主机,后者用于基于 IP 的主机。如果 Apache 由于没有 Host: 标头或 DNS 查找失败而无法计算出服务器名称,则使用 ServerName 配置的值代替。

“伪造”的另一件事是文档根目录(使用 DocumentRoot 配置并通过 DOCUMENT_ROOT 环境变量可用于 CGI)。在正常配置中,核心模块在将 URI 映射到文件名时使用此设置,但是当服务器配置为进行动态虚拟托管时,该作业由另一个模块(mod_vhost_alias 或 mod_rewrite)接管,该模块具有不同的执行方式映射。这两个模块都不负责设置 DOCUMENT_ROOT 环境变量,因此如果任何 CGI 或 SSI 文档使用它,它们将得到一个误导值。

试试:

# get the server name from the Host: header
UseCanonicalName Off

# this log format can be split per-virtual-host based on the first field
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot /path/to/default/folder/%0
VirtualScriptAlias /www/hosts/%0

http://httpd.apache.org/docs/2.2/en/vhosts/mass.html