Hospedagem virtual em massa com o Apache 2.4

3

Eu gostaria de usar o valor definido por VirtualDocumentRoot em RewriteRule .

O Apache diz:

The other thing to determine is the document root (configured with DocumentRoot and available to CGI scripts via the DOCUMENT_ROOT environment variable). In a normal configuration, this is used by the core module when mapping URIs to filenames, but when the server is configured to do dynamic virtual hosting, that job must be taken over by another module (either mod_vhost_alias or mod_rewrite), which has a different way of doing the mapping. Neither of these modules is responsible for setting the DOCUMENT_ROOT environment variable so if any CGIs or SSI documents make use of it, they will get a misleading value.

referindo-se a documentação, parece que eu não será capaz de usar %{DOCUMENT_ROOT} em RewriteRule . Mas depois de olhar para soluções alternativas, eu encontrei este bilhete (título: ambiente DOCUMENT_ROOT variável definir incorretamente com VirtualDocumentRoot ) dizendo que foi “corrigido em 2.4.1”.

Estou usando a versão mais recente (estável) do Apache:

$ httpd -v
Server version: Apache/2.4.9 (Unix)
Server built:   Jun 18 2014 03:07:48

... mas não parece funcionar para mim. Ao testar, %{DOCUMENT_ROOT} tem o valor padrão definido pelo DocumentRoot no httpd.conf. Gostaria %{DOCUMENT_ROOT} (ou qualquer outra variável que eu poderia usar) a ser definido dinamicamente pelo VirtualDocumentRoot .

Aqui está o que eu gostaria de usar no httpd-vhosts.conf:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

Existe uma solução?

    
por Matworms 20.06.2014 / 19:23

4 respostas

1

Depois de ter olhado em várias direções com John Auld (obrigado pelo seu tempo e ajuda), tenho finalmente encontrei uma solução. Como eu disse em um comentário anterior , não é 100 % perfeito mas bom o suficiente para mim.

Para maior clareza, aqui está o que eu queria ter no httpd-vhosts.conf:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

E aqui está o que eu criei:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2/%-3"

    RewriteCond %{SERVER_NAME} (?:([^.]+)\.)?([^.]+)\.dev
    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/usr/local/var/www/.dev/%2/${:%1|www}/$1" [P]
</VirtualHost>

Eu uso RewriteCond para capturar partes de %{SERVER_NAME} e reutilizá-las em RewriteRule .

Existem dois grupos de captura: subdomínio ( %1 ) e domínio ( %2 ). O subdomínio é opcional, portanto, uso a sintaxe ${map:value|default} para definir um valor padrão para o subdomínio quando vazio.

VirtualDocumentRoot tem seu próprio valor padrão quando uma parte ( %N.M ) não está disponível. Como dito na documentação :

If N or M is greater than the number of parts available a single underscore is interpolated.

É por isso que eu tive que usar um pequeno "truque" para fazê-lo funcionar com um subdomínio opcional:

ln -sfv /path/to/the/project/www /path/to/the/project/_

Se você pensar em uma maneira de fazer isso apenas , deixe um comentário e eu editarei minha resposta com sua contribuição.

    
por 23.06.2014 / 14:31
2

Eu realizei isso usando mod_proxy e mod_proxy_fcgi, observando a seção " Proxy via Handler ": link

Eu precisava ser capaz de rodar o PHP 5.6 e o PHP 7 nos meus sites dev locais, então eu instalei o PHP-FPM para o PHP 5.6 e o PHP 7 e configurei a configuração do vhosts da seguinte forma:

<Virtualhost *:80>
    VirtualDocumentRoot "/Volumes/CODE/projects/%1"
    ServerName sites.hack
    ServerAlias *.hack
    UseCanonicalName Off
    <FilesMatch "\.php$">
        Require all granted
        SetHandler proxy:fcgi://127.0.0.1:9056
    </FilesMatch>
</Virtualhost>

<Virtualhost *:80>
    VirtualDocumentRoot "/Volumes/CODE/projects/%1"
    ServerName php7.php
    Serveralias *.php
    UseCanonicalName off
    <FilesMatch "\.php$">
      Require all granted
      SetHandler proxy:fcgi://127.0.0.1:9070
    </FilesMatch>
</Virtualhost>

Como a seção "Proxy via manipulador" explica:

When FastCGI is configured this way, the server can calculate the most accurate PATH_INFO.

Com essa configuração, posso:

Visite um site de desenvolvimento local http://example.hack e ele será extraído da Document Root /Volumes/CODE/projects/example e será passado para o meu serviço PHP PHP PHP-FPM SetHandler proxy:fcgi://127.0.0.1:9056 .

Visite um site de desenvolvimento local http://example.php e ele será extraído da mesma raiz de documento /Volumes/CODE/projects/example , mas será passado para o serviço PHP-PHP do PHP 7 SetHandler proxy:fcgi://127.0.0.1:9070

Ainda não tive problemas com isso. É simples e funciona.

    
por 06.09.2016 / 00:11
0

A variável não está disponível nos arquivos de configuração do apache.

Dê uma olhada no mod_macro, que permite o uso de variáveis dentro dos arquivos conf.

link

    
por 20.06.2014 / 22:11
0

A seguir funcionou bem para mim por 2,4

UseCanonicalName Off
<VirtualHost *:80>
  ServerName auto.dev
  ServerAlias *.dev
  VirtualDocumentRoot /Users/yourusername/Sites/auto/%1/public

  <Directory ~ "/Users/yourusername/Sites/auto/.*/public">
    Options Indexes FollowSymlinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

Note que estou mapeando para a pasta pública na pasta raiz

    
por 22.05.2017 / 04:07