Apache UseCanonicalName On 没有将 ServerName 传递给 CGI

Apache UseCanonicalName On 没有将 ServerName 传递给 CGI

在 Apache 2.4 的虚拟主机中我有:

UseCanonicalName On
ServerName somename
ServerAlias www.someothername.com

根据文档:

使用 UseCanonicalName On Apache 将使用 ServerName 指令中指定的主机名和端口来构建服务器的规范名称。此名称用于所有自引用 URL,以及 CGI 中的 SERVER_NAME 和 SERVER_PORT 的值。

因此,在我的 Tomcat/CFML 应用程序中,当我访问 URL 时,www.someothername.com我希望在 CGI 范围内看到:

server_name: somename

但我得到的却是:

server_name: www.someothername.com

就像该指令完全被忽略了一样。

# Proxy CFML files to Tomcat
RewriteCond %{REQUEST_FILENAME} /[^/:]+\.cfml*($|/)
RewriteRule (.*) ajp://%{HTTP_HOST}:8009$1 [P,L]

我也尝试过:

RewriteRule (.*) ajp://%{SERVER_NAME}:8009$1 [P,L]

并使用 mod_proxy 代替 AJP:

RewriteRule (.*) http://%{SERVER_NAME}:8888$1 [P,L]

最后两个导致 DNS 查找,somename但仍然返回www.someothername.comCGI.SERVER_NAME 字段

我应该指出,我这样做的唯一原因是因为我正在进行大量虚拟托管以mod_cfml自动创建 tomcat 上下文,并且我希望上下文和应用程序使用从 vhost 配置派生的短名称。我想我可以设置一个标头(甚至重写 Host: 标头),但使用 ServerName 似乎是最优雅的解决方案。

更新:我注意到客户端标头中有一些可能相关的内容。有两个标头我以前从未见过:

x-forwarded-host: www.someothername.com
x-forwarded-server: somename

我需要知道设置这些标头的原因和原因。我假设是 Tomcat 或 mod_cfml。我可以依赖该x-forwarded-server值始终为 ServerName 吗?

答案1

您不是在调用 CGI,而是在代理,因此尝试设置 SERVER_NAME 要么无用,要么非常接近它。

通常,对于大规模虚拟主机,您应该在应用程序中使用收到的实际域名(即 HTTP_HOST,即Host:HTTP 标头)来进行区分。

相关内容