На Apache 2.4 в виртуальном хосте у меня есть:
UseCanonicalName On
ServerName somename
ServerAlias www.someothername.com
Согласно документам:
С UseCanonicalName On Apache будет использовать имя хоста и порт, указанные в директиве ServerName, для создания канонического имени для сервера. Это имя используется во всех ссылках на себя, а также для значений SERVER_NAME и SERVER_PORT в CGI.
Итак, в моем приложении 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]
Последние 2 вызывают поиск DNS на somename
но все равно возвращается www.someothername.com
в поле CGI.SERVER_NAME
Я должен отметить, что единственная причина, по которой я это делаю, заключается в том, что я занимаюсь массовым виртуальным хостингом с mod_cfml
для автоматического создания контекстов tomcat, и я хотел бы, чтобы контекст и приложение использовали короткое имя, полученное из конфигурации vhost. Думаю, я мог бы просто установить заголовок (даже переписать заголовок Host:), но использование ServerName показалось самым элегантным решением.
ОБНОВЛЕНИЕ: в заголовках клиентов я заметил кое-что, что, вероятно, имеет отношение к делу. Есть 2 заголовка, которые я раньше не видел:
x-forwarded-host: www.someothername.com
x-forwarded-server: somename
Мне нужно знать, что устанавливает эти заголовки и почему. Я предполагаю, что это был либо Tomcat, либо mod_cfml. Могу ли я положиться на x-forwarded-server
значение всегда быть ServerName?
Вы не вызываете CGI, вы проксируете, поэтому попытки установить SERVER_NAME бесполезны или очень близки к нему.
Обычно при массовом виртуальном хостинге вы должны использовать фактическое доменное имя, которое вы получили, то есть HTTP_HOST, Host:
HTTP-заголовок в вашем приложении, чтобы различать.