Como usar o mod_rewrite com o Apache -> mod_jk -> configuração do tomcat?
-
28-10-2019 - |
Pergunta
Relacionado a algumas das minhas perguntas anteriores.
Agora tenho uma configuração que gosto bastante;
Apache httpd ouvindo na porta 80 aceitando conexões http e https. Várias instâncias do Tomcat em execução em várias portas AJP.
Mod_Jk está enviando diferentes solicitações de url para diferentes instâncias do tomcat;
www.mydomain.com/demo -> tomcat:8101
www.mydomain.com/test -> tomcat:8102
www.mydomain.com/ -> tomcat:8100
Isso é obtido com a seguinte configuração em httpd.conf (ou sub-arquivos incluídos);
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>
E tudo isso funciona muito bem. Também tenho SSL configurado e funcionando para conexões https usando uma tag VirtualHost semelhante;
<VirtualHost _default_:443>
JkMount /demo* demoTomcat
JkMount /test* testTomcat
JkMount /* rootTomcat
... SSL Stuff follows ....
O que estou tendo problemas agora é que meu certificado SSL é apenas para www.mydomain.com e NÃO mydomain.com.
Fui aconselhado a usar as seguintes chamadas de 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]
Coloquei isso antes e depois das regras mod_jk no arquivo httpd.conf. O Apache estava reclamando no início que RewriteEngine era um comando inválido, mas isso foi embora quando me lembrei do comando LoadModule primeiro :) Agora o Apache reinicia perfeitamente, o servidor inicia e aceita solicitações e tudo funciona da maneira que costumava ... mas isso é só isso, esses comandos mod_rewrite parecem não ter efeito?
Eu digito http://mydomain.com
no navegador e acabo de acessar meu site normalmente. O url não parece mudar para http://www.mydomain.com
e quando eu começo a acessar as áreas protegidas, recebo avisos de que mydomain.com
NÃO está protegido e está me fornecendo um certificado de outro site chamado www.mydomain.com
(por que isso é um problema e pode? apenas use alguma lógica para perceber que é o mesmo site, não sei!).
Estou colocando as regras do mod_rewrite no lugar errado? Eu li que deve funcionar, as reescritas devem mudar o url para www. e depois passar para o mod_jk para mais alguma coisa?
Solução
Coloque este snippet logo após a última linha jkmount na sua configuração do 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>
O que esta regra está fazendo é o esquema SE for https e seu host http NÃO www.mydaomain.com
ENTÃO redirecionar a solicitação https://example.com/foo
para https://www.example.com/foo
com um 301status http.