apache 2.4, mod_proxy_fcgi não honrando .htaccess, trabalho necessário

3

Estou usando o apache 2.4.7 com o mod_proxy_fcgi com o propósito de passar através de php para php-fpm (isso será usado para hospedagem compartilhada meio Ambiente). O htaccess funciona bem para arquivos não php, mas uma vez que bateu reescrever regra que proxies através das solicitações do php, o htaccess é ignorado.

Eu sei porque isso está acontecendo. A questão é: como faço para contornar isso?

A questão de como forçar o apache a tratar o pedido para o arquivo php como uma requisição ao arquivo local, e depois procurá-lo?

Eu gastei um tempo substancial pesquisando sobre esse problema, e seguintes "respostas" foram dadas como solução:

1) "usar configuração do apache em vez de .htaccess" é válido solução, mas não para o ambiente de hospedagem compartilhada (não vou dar acesso à configuração do apache para clientes de hospedagem compartilhada;)).

2) "não use o .htaccess, pois tem desempenho / segurança / outros problemas", bem como mais compartilhada clientes de hospedagem controle de acesso / url reescrevendo em seu site? Além disso, se o htaccess não fosse requisito eu simplesmente usaria nginx.

3) "colocar regra de reescrever para proxy dentro de" - isto é incorreto e não funciona.

Esse comportamento parece não ser um bug, mas um "recurso", conforme link

    
por user229874 09.07.2014 / 01:27

5 respostas

-1

EDITAR:

A solução real para este problema não é colocar a regra de reescrita do proxy em php-fpm, mas fazer o seguinte:

RewriteCond %{REQUEST_URI} -U
RewriteRule (.*\.php)$ fcgi://IP:PORT/$1 [P,L]

Fora das tags e dentro das tags.

Como a solução original tinha um problema: se houver "RewriteEngine On" ou qualquer regra / condição "RewriteRule", isso fará com que o Apache ignore completamente as regras de reescrita dentro das tags no arquivo de configuração principal.

O abaixo não está totalmente correto

Descobri que estava errado em não trabalhar dentro da tag.

RewriteMap and standard rewrite lookup of the user dirs goes here

<Directory /PATH_TO_WWW/*>
      Standard directory conf goes here

      RewriteRule ^(.*\.php)$ fcgi://IP_OF_THE_FPM:FPM_PORT/$1 [P,L]

</Directory>

Basicamente, o segredo (para mim, pelo menos) eu precisava colocar regra de reescrita que proxies através de tags de diretório que são para o diretório comum dos usuários com *.

por isso, se eu tiver usuários em / var / www / $ username, a tag do diretório deve ficar assim:

TL; DR: use a regra de reescrita de proxy dentro de tags de diretório para o diretório de usuários comuns.

    
por 10.07.2014 / 00:46
2

Tenha em atenção que RewriteCond -U irá verificar se o URI está correto antes de fazer o redirecionamento atual, portanto, duplicando cada pedido! Isso pode ter um impacto severo no desempenho, especialmente em sites carregados com muita carga.

Eu sugiro verificar "RewriteOptions InheritBefore", que parece resolver qualquer problema relacionado à herança de htaccess, como descrito aqui:

Noções básicas sobre o apache 2.4 mod_proxy_fcgi e RewriteRules no htaccess

Felicidades, Giorgio

    
por 20.08.2014 / 23:17
2

Enquanto isso, outra opção está disponível desde o Apache 2.4.10: Proxy via Handler. Veja o exemplo na documentação do Apache: exemplos do mod_proxy_fcgi

You can also force a request to be handled as a reverse-proxy request, by creating a suitable Handler pass-through. The example configuration below will pass all requests for PHP scripts to the specified FastCGI server using reverse proxy. This feature is available in Apache HTTP Server 2.4.10 and later. For performance reasons, you will want to define a worker representing the same fcgi:// backend. The benefit of this form is that it allows the normal mapping of URI to filename to occur in the server, and the local filesystem result is passed to the backend. When FastCGI is configured this way, the server can calculate the most accurate PATH_INFO.

<Proxy "fcgi://localhost/">
    ProxySet enablereuse=On
</Proxy>
<FilesMatch "\.php$">
    SetHandler "proxy:fcgi://localhost:9000"
</FilesMatch>

Isso permite RewriteRules e autenticação em arquivos .htaccess. Depois que toda a reescrita estiver concluída, a solicitação é passada para php-fpm.

    
por 11.09.2017 / 21:36
1

aparece você passa toda a sua execução do php para o seu servidor cgi rápido, que não sabe como usar o htaccess, e é por isso que ele ignora esses arquivos. Se você precisa usar arquivos htaccess pelo Apache, então você precisa executar scripts php pelo Apache (ou seja, usando mod_php) ao invés de passar a execução para outro serviço que não tem idéia sobre o htaccess.

Você pode refazer suas regras de reescrita, mas como elas são controladas pelo usuário, não é possível fazer muita coisa sobre isso.

    
por 09.07.2014 / 02:28
0

eu acho que esse é o método mais limpo, sem qualquer reescrita feia na configuração do apache:

<VirtualHost IP:80>
    ServerName domain.tld
    ServerAlias www.domain.tld
    DocumentRoot /var/www/project/web

    <FilesMatch \.php$>
        SetHandler proxy:fcgi://127.0.0.1:9000
    </FilesMatch>

    <Directory /var/www/project/web>
        AllowOverride All
    </Directory>
</VirtualHost>
    
por 13.02.2015 / 17:35