Dê ao PHP uma URL e um protocolo de pedido falsos com Apache2 e mod_php

1

Eu executo um servidor da web com vários usuários. A máquina fornece hosts virtuais baseados em Apache para um grupo de usuários, que podem servir conteúdo estático ou usar PHP. Nenhuma outra forma de script do lado do servidor está disponível.

Veja como uma solicitação típica é tratada:

O tráfego HTTPS tem seu SSL removido por Pound, que age como um proxy reverso e encaminha a solicitação para o Varnish, que também atua como um proxy reverso, finalmente encaminhando a solicitação para o Apache.

No momento em que o tráfego HTTPS atinge o Apache, o protocolo, a porta e o URL completo foram alterados de, digamos, https://example.com:443/ para http://example.com:8443/ . Este é um resultado de todos os proxies antes do Apache.

Existe uma maneira de eu enganar os scripts PHP pensando que a solicitação veio da URL, porta e protocolo originais, sem modificar o código PHP ?

Isso é importante porque os usuários desejam executar o Joomla, o WordPress e outros CMSs baseados em PHP que detectam a URL e causam problemas com redirecionamentos, links, etc.

Eu provavelmente poderia corrigir mod_php e compilá-lo a partir do código-fonte com as alterações necessárias para o meu cenário específico, mas há uma maneira melhor de fornecer aos scripts PHP variáveis ambientais falsas, talvez por meio de algumas configurações no php.ini?

    
por Tom Marthenal 02.04.2013 / 08:12

1 resposta

0

A maneira mais fácil de encontrar isso é soltando mod_php e usando um script CGI. Isso permite que você chame php-cgi (uma versão direcionada a CGI do interpretador PHP) de um script de shell que é executado no carregamento da página.

Aqui está um exemplo de script bash que define as variáveis de ambiente SERVER_PORT e HTTPS com base no cabeçalho X-Forwarded-Proto e, em seguida, chama php-cgi :

#!/bin/bash
# HTTPS fix (WARNING: THIS HEADER CAN BE FAKED BY THE CLIENT)
if [[ "$HTTP_X_FORWARDED_PROTO" == "https" ]]; then
        export SERVER_PORT=443
        export HTTPS="on"
else
        export SERVER_PORT=80
fi

php-cgi

É claro que você deve ter cuidado, porque o cabeçalho X-Forwarded-Proto pode ser enviado pelo cliente, então, a menos que você tenha algo entre o Apache e o cliente que limpa esse cabeçalho, você não deve confiar nele! (você provavelmente também quer desligar o Apache, ou melhor ainda, apenas escutar em loopback)

Tudo o que você precisa fazer é fazer com que o Apache use este script bash para cada arquivo com a extensão .php ( mod_cgi e mod_actions permitem fazer isso).

    
por 02.04.2013 / 09:15