Как использовать mod_rewrite с Apache -> mod_jk -> установка tomcat?

В связи с некоторыми из моих предыдущих вопросов.

Теперь у меня есть установка, которая мне очень нравится;

Apache httpd прослушивает порт 80 и принимает соединения http и https. Несколько экземпляров Tomcat, работающих на нескольких портах AJP.

Mod_Jk отправляет разные запросы URL в разные экземпляры tomcat;

www.mydomain.com/demo -> tomcat:8101
www.mydomain.com/test -> tomcat:8102
www.mydomain.com/     -> tomcat:8100

Это достигается с помощью следующей конфигурации в httpd.conf (или включенных подфайлах);

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

NameVirtualHost *:80

<VirtualHost *:80>
    JkMount /demo* demoTomcat (workers.properties not shown)
    JkMount /test* testTomcat
    JkMount /* rootTomcat
</VirtualHost>

И все это прекрасно работает. У меня также есть настройка и запуск SSL для соединений https с использованием аналогичного тега VirtualHost;

<VirtualHost _default_:443>
    JkMount /demo* demoTomcat 
    JkMount /test* testTomcat
    JkMount /* rootTomcat
... SSL Stuff follows ....

Теперь у меня проблемы с тем, что мой SSL-сертификат предназначен только для www.mydomain.com, а НЕ для mydomain.com.

Мне посоветовали использовать следующие вызовы mod_rewrite;

Options +FollowSymlinks
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.|$) [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [PT,L]

Я разместил их до и после правил mod_jk в файле httpd.conf. Apache сначала жаловался, что RewriteEngine недопустимая команда, но это исчезло, когда я сначала вспомнил команду LoadModule :) Теперь Apache перезагружается нормально, сервер запускается и принимает запросы, и все работает так, как раньше ... но это просто кажется, что эти команды mod_rewrite не имеют никакого эффекта?

Я набираю http://mydomain.com в браузере, и я просто получаю свой веб-сайт, как обычно. URL-адрес не меняется на http://www.mydomain.com, и когда я начинаю получать доступ к защищенным областям, я получаю предупреждения о том, что mydomain.com НЕ защищен и предоставляет мне сертификат с какого-то другого веб-сайта под названием www.mydomain.com (почему это вообще проблема, и она может' Я просто не могу использовать какую-то логику, чтобы понять, что это тот же самый сайт, я не знаю!).

Я размещаю правила mod_rewrite не в том месте? Я читал, что это должно работать, переписывание должно изменить URL-адрес на www. а затем перейти к материалу mod_jk для чего-то еще?


person Nick Foote    schedule 23.03.2011    source источник


Ответы (1)


Поместите этот фрагмент сразу после последней строки jkmount в конфигурацию apache:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} =on
        RewriteCond %{HTTP_HOST} !^www\.example\.name$ [NC]
        RewriteRule ^ https://www.example.name%{REQUEST_URI} [NE,L,R=301]
    </IfModule>

Это правило делает следующее: схема ЕСЛИ — это https, а ваш http-хост НЕ www.mydaomain.com ТО перенаправляет запрос https://example.com/foo на https://www.example.com/foo со статусом http 301.

person anubhava    schedule 23.03.2011
comment
Привет, нет. Я пробовал этот фрагмент внутри и снаружи тегов VirtualHost, как для vhost, так и для ssl. Я пробовал до и после линий JkMount. Кажется, ничего не происходит, за исключением, возможно, зависания браузера там, где раньше он сразу жаловался на недействительный сертификат! Я установил уровень журнала перезаписи на 9! Файлы журнала создаются (поэтому модуль должен работать), но НИКОГДА ничего не регистрируется! 0 байт все время! - person Nick Foote; 25.03.2011
comment
Я не знаю, что мне здесь не хватает. Я даже пробовал чье-то предложенное правило, которое просто перенаправляет с www.mydomain.com/foo.html на мою домашнюю страницу и ничего не делает. И ничего никогда не регистрируется. Насколько я вижу, mod_rewrite НИКОГДА не срабатывает и ничего не делает, кроме создания пустого файла журнала! - person Nick Foote; 25.03.2011
comment
@Nick Foote: Поскольку это правило ТОЛЬКО для https, место для вышеуказанных правил было только до конца тега <VirtualHost _default_:443>. Также вы можете попробовать заменить эту строку RewriteCond %{HTTPS} =on на эту строку в моем ответе выше: RewriteCond {SERVER_PORT} =443 - person anubhava; 25.03.2011
comment
в конце концов он заработал, но с этим; RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC] RewriteRule ^(.*)$ domain.com /$1 [R=301,L] - person Nick Foote; 30.06.2011
comment
@Nick Foote: Рад, что вы все правильно поняли, да, я пропустил ! в своем RewriteCond. - person anubhava; 30.06.2011
comment
Я пытался отредактировать ваш ответ, чтобы исправить отсутствующий символ !, но SO жалуется на использование mydomain.com... Не хотел так сильно изменять ваш ответ, заменяя домены (SO предлагает использовать example.com), учитывая, что на самом деле это точно отвечает на вопрос ОП... - person mmuller; 08.11.2017