在 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.com
CGI.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 标头)来进行区分。