Como forçar o Apache a usar o HTTPS em conjunto com o AJP?

5

Nós temos um site da Apache, com certas partes ativadas pelo JBoss. A questão é: como podemos fazer com que o Apache force todas as solicitações HTTP a serem redirecionadas para o equivalente HTTPS?

Em nosso servidor antigo (CentOS 4, Apache 2.0, mod_jk), temos a seguinte configuração:

<VirtualHost 1.2.3.4:80>
Redirect / https://www.foo.com/
</VirtualHost>

Isso funciona muito bem - qualquer solicitação para uma página da Web PHP, vanilla HTML ou JBoss é redirecionada. No entanto, no nosso novo servidor (CentOS 5, Apache 2.2, mod_proxy_ajp), a mesma configuração somente funciona para páginas baunilha - não para nada ser enviado para o JBoss usando AJP.

Eu também tentei o seguinte, que encontrei no link :

<Proxy *>
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Proxy>

Mas ainda sem sorte. Eu sinto que estou sentindo falta de algo óbvio. Alguma ajuda?

P.S. Eu não sou de forma alguma um especialista em Apache. Peço desculpas se isso se tornar uma questão inicial :-P.

    
por Matt Solnit 08.05.2009 / 06:15

4 respostas

9

Se eu entendi corretamente, você deseja atualizar todas as solicitações HTTP para https. Se isso estiver correto, tente isto

<VirtualHost ip:80>
   ServerName www.company.com

   RedirectMatch permanent ^(.*)$ https://www.company.com$1
</VirtualHost>

<VirtualHost ip:443>
   ServerName www.company.com

   Include vhosts.d/includes/ssl.conf

   # assumes you want to proxy everything on this vhost to jboss:8009
   <Location / >
       ProxyPass ajp://jboss:8009/
   </Location>
</Location>
    
por 09.05.2009 / 17:01
5

Esta sintaxe será redirecionada para HTTPS, mantendo o host e a URL iguais:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Às vezes, você só quer redirecionar um diretório, ou seja, uma área de administração:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/admin(|/.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
por 26.11.2012 / 02:03
2

No entanto, para resolvê-lo, sugiro colocar a diretiva SSLRequireSSL nos locais desejados para ser apenas SSL. Dessa forma, se houver um erro de configuração mais tarde no processo, nada será exposto por uma conexão não SSL.

    
por 09.05.2009 / 21:41
2

A sintaxe mais eficiente para o redirecionamento ssl é usando o apache env var HTTPS

Você faz assim:

Reescrita do host

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://yourhost.com%{REQUEST_URI} [R,L]

Sem reescrever o host

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Em relação ao mod_jk vs apache2.2 ajp proxy eu uso mod_jk só porque eu acho JkMount e JkUnMount para ser útil quando você precisa separar o conteúdo estático e dinâmico, eu diria que é mais simples. A maneira que eu estruturo minhas configurações é com o condicional incluindo para ssl. Então eu tenho um httpd.conf para cada host, eu tenho um diretório para cada conf incluindo o seguinte:

/etc/httpd/test_conf.httdp.conf:

SeverName test.com
ServerRoot /etc/httpd
LoadModule jk_module modules/mod_jk.so
LoadModule ssl_module/mod_ssl.so
(snip)
Include conf/test_com/*.conf

/etc/httpd/test_conf/mod_jk.conf

<IfModule jk_module>
JkWorkersFile conf/test_conf/workers.properties

JkLogFile logs/test_conf/mod_jk.log 

JkLogLevel error

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

JkRequestLogFormat "%w %V %T"

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE|TRACK|OPTIONS|TRACE)
RewriteRule .* - [F] 

JkMount /* loadbalancer
JkUnMount /error* loadbalancer

JkShmFile run/jk.shm

<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

</IfModule>

/etc/httpd/conf/test_conf/workers.properties

worker.list=loadbalancer,status

worker.node1.port=8009
worker.node1.host=192.168.1.100
worker.node1.type=ajp13
worker.node1.lbfactor=2
worker.node1.ping_mode=A
worker.node1.connect_timeout=10000
worker.node1.prepost_timeout=10000
worker.node1.socket_timeout=90
worker.node1.connection_pool_timeout=600
worker.node1.method=R
worker.node1.fail_on_status=500,501,502,503

worker.node2.reference=worker.node1
worker.node2.host=192.168.1.200

worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=true
worker.status.type=status

/etc/httpd/conf/test_conf/httpd-ssl.conf

<IfModule ssl_module>
Listen 192.200.10.100:443

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

(snip)
<VirtualHost 192.200.10.100:443>

DocumentRoot "/var/www/test.com/htdocs"
ServerName test.com
(snip)
SSLEngine on
SSLProtocol all -SSLv2 
SSLCipherSuite DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA

SSLCertificateFile "conf/test_conf/ssl/test_com.crt"
SSLCertificateKeyFile "conf/test_conf/ssl/test_com.key"
SSLCACertificateFile "conf/test_conf/ssl/VerisignIntermediate.crt"


BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

JkMount /* loadbalancer
JkUnMount /error* loadbalancer

JkStripSession On

</VirtualHost>
</IfModule>
    
por 08.07.2009 / 08:24