Назад | Перейти на главную страницу

Apache UseCanonicalName On не передает ServerName в CGI

На 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-заголовок в вашем приложении, чтобы различать.