Apache2 VirtualHost IfPort?

4

Eu gostaria de criar um host virtual como este:

<VirtualHost *:80 *:443>
    <IfPort 443>
        SSLEngine On
        ...
    </IfPort>

    ...
</VirtualHost>

Portanto, se o host tiver sido acessado pela porta 443, quero adicionar algumas funcionalidades adicionais. Posso conseguir isso de alguma forma ou tenho que separar isso em dois hosts virtuais?

    
por morgoth84 30.12.2013 / 19:00

4 respostas

3

Eu uso mod_macro para resolver esse problema em um servidor que hospeda uma tonelada de domínios diferentes ... Instale o módulo (difere por OS / Distro) e configure algo assim:

LoadModule macro_module         libexec/apache22/mod_macro.so

<Macro VHost $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

<Macro VHostSSL $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost>
        <VirtualHost *:443>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                SSLEngine on
                SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
                SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

Use VHostSSL example.com 
Use VHost    example.net

Super fácil de adicionar um novo domínio; quaisquer configurações específicas de domínio são lançadas no arquivo de inclusão.

    
por 30.12.2013 / 21:09
2

Outra opção para evitar a duplicação seria manter a configuração do virtualhost em um arquivo específico e puxá-la com um include:

/etc/path/to/config/example.com.conf :

ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts

E seu arquivo de hosts virtuais:

<VirtualHost *:443>
    SSLEngine on
    # Other SSL directives
    Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
    Include /etc/path/to/config/example.com.conf
</VirtualHost>
    
por 30.12.2013 / 19:54
1

usando a solução de John eu recebo isso

Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here

como John disse, a melhor maneira é ter dois hosts virtuais mas o meu código de host virtual foi mais de 150 linhas (lotes de proxies reversos) como eu não queria ter 2 de cada código (e um arquivo de configuração muito longo) acabei fazendo isso que funciona:

1.Crie um host virtual para host virtual não-ssl.

2.Crie outro host virtual e proxy reverso para o primeiro host virtual

<VirtualHost *:443>
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "...cert.crt"
    SSLCertificateKeyFile "...server.ssl.key"
    ... (any ssl specific config)

    ProxyPreserveHost On
    ProxyPass / http://localhost:80/
    ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>

isto não é de todo uma solução boa ou amigável ao desempenho mas se a razão por trás de não querer 2 hosts virtuais é evitar 2 verões de todas as configurações do host virtual (o que significa mudar 2 linhas cada vez que você quiser mudar alguma coisa) funciona.

    
por 30.12.2013 / 19:29
1

Dê uma olhada na estrutura Apache If e manipule a solicitação. Consulte a documentação principal para If s e lista de expressões disponíveis para usar nele . Você poderia fazer algo como:

<If "%{SERVER_PORT} == '443'">
    # Do stuff
</If>

Com relação à sua tag VirtualHost , não vejo essa solução na documentação do Apache2. Consulte o link e tente sua opção: o Apache2 usa um semelhante para IPs diferentes de portas diferentes ( link ).

Eu ainda recomendaria o uso de dois hosts virtuais distintos, muito mais claros. Você precisará de dois NameVirtualHost e Listen no seu arquivo apache2.conf , de qualquer forma.

Editar

Eu não percebi que esta solução realmente gerou um erro, mas vamos voltar ao conceito em si ... Ouvindo 80 ou 443 sem problemas, na verdade. O Apache2 forneceria de bom grado uma solução elegante para isso, se não fosse por ... criptografia. O Apache2 foi desenvolvido em C e, além dos encadeamentos e garfos, usa soquetes. Em C, o uso de SSL requer a inicialização dos componentes do OpenSSL e alguns trabalham em torno do soquete básico para implementar todo o SSL. Você está procurando uma solução fácil, mas todo o mecanismo por trás é complicado ... É por isso que você não pode ativar o SSL em um host virtual básico: HTTP e HTTPs são componentes diferentes, e no modo Apache2, eu receio que haja nenhum conceito de herança entre o primeiro e o segundo.

    
por 30.12.2013 / 19:09