您好,我正在尝试允许用户使用 CNAME 将域映射到我们。我们的服务器运行的是 CentOS 6.4 和 Apache。当我在另一个域上创建 CNAME 时,我们具有以下值:
test.otherdomain.com -> app.example.com
该请求加载 www.example.com。这是我的 VHOSTS 中的第一条规则,其顺序如下;
:80
ServerName www.example.com
ServerAlias example.com
:443
ServerName www.example.com
ServerAlias example.com
:80
ServerName sub1.example.com
:443
ServerName sub1.example.com
:80
ServerName sub2.example.com
:443
ServerName sub2.example.com
:80
ServerName app.example.com
ServerAlias *.example.com
:443
ServerName app.example.com
ServerAlias *.example.com
*.example.com 允许用户创建自定义子域名,因此他们可以创建除 www、sub1 或 sub2 之外的任何内容。例如:acme.example.com。
经过一番研究,我发现问题是传递的主机与我的任何规则都不匹配,因此第一个定义的站点正在被服务?当用户访问 test.otherdomain.com 时,如何创建一个默认站点或捕获所有将为 app.example.com 提供服务的站点?
用户在我们的应用程序的表单中输入他们的域,因此我无法将它们全部作为别名添加到我的 vhost 条目中。如果我将 app.example.com 作为第一条规则(不带通配符别名),然后再次在文件底部使用通配符别名,Apache 似乎更喜欢通配符规则,并且静态子域 sub1 和 sub2 重定向到应用程序。
谢谢!
答案1
固定的!
第一条规则必须是默认规则。更改规则如下可使其生效:
:80
ServerName app.example.com
:443
ServerName app.example.com
:80
ServerName www.example.com
ServerAlias example.com
:443
ServerName www.example.com
ServerAlias example.com
:80
ServerName sub1.example.com
:443
ServerName sub1.example.com
:80
ServerName sub2.example.com
ServerAlias *.example.com
:443
ServerName sub2.doexampleain.com
ServerAlias *.example.com
这样可以让 sub1 保持静态,而由于 sub2/sub3 仅用于线程化额外的 AJAX 调用,因此它们是应用程序的迷你版本。通过将该代码移动到主应用程序并更改通配符,使其不成为应用程序规则的一部分,一切都会正常!
答案2
使用基于名称的虚拟主机,Apache 中定义的第一个 VHOST 条目是所有与其他内容不匹配的主机名的捕获总条目。
既然你提到你想要app.example.com要首先提供服务的 VHOST,您应该确保它是 Apache 配置中定义的第一个。有多种方法可以实现这一点:
- 直接添加到主配置文件中
- 确保它首先包含在主配置中(Include 指令)
- 如果使用包含目录,则使文件按字母顺序列出,例如通过在文件名中添加下划线(例如
_default.conf
)