Estou no processo de migrar muitos sites de uma antiga para uma nova configuração de servidor. Cada site é baseado em uma base de código semelhante (mas infelizmente não é idêntica), usando URLs mod_rewrite.
- Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
- Apache 2.22.8 => Apache 2.2.22
- PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)
Principalmente funcionando como um encanto, mas na nova configuração o $ _SERVER ['REDIRECT_URL'] não está mais definido, e o código está falhando devido a uma dependência dessa variável global.
Pelo que entendi, essa variável é definida pelo Apache quando ocorre um redirecionamento. Obviamente, isso não está acontecendo agora, mas estou lutando para encontrar a causa.
- É a atualização do Apache ou (meu palpite) a mudança do PHP FastCGI para o PHP5-FPM?
- Como obtenho essa variável de volta?
Eu realmente prefiro não precisar editar o código em cada site, portanto, definirei um auto_prepend global do PHP, se necessário, mas, idealmente, gostaria de corrigir a configuração do servidor e defini-la em primeiro lugar.
Potencialmente relacionado: agora também tenho algumas novas variáveis $ _SERVER, REDIRECT_SCRIPT_URL e REDIRECT_REDIRECT_SCRIPT_URL. Estes parecem ter os dados corretos que eu quero para o REDIRECT_URL, mas também parecem indicar que há dois redirecionamentos internos que não existiam antes - o Google pesquisa por REDIRECT_REDIRECT_SCRIPT_URL apenas retorna saídas aleatórias var_dump. SCRIPT_URL é o novo REDIRECT_URL?
Editar 1
Verificar novamente que REDIRECT_URL está (agora) definido, mas sempre para 'index.php' (o destino mod_rewrite) em vez do URL digitado esperado. Eu usei o arquivo auto_prepend_file do PHP para definir manualmente a variável necessária.
Não sei ao certo como perdi a partida da primeira vez, mas fiz várias alterações enquanto isso, então suponho que haja uma chance externa de que ela não estivesse lá. Desculpas se isso enganar alguém.
Editar 2
Para abordar as menções de ErrorDocument abaixo, a regra mod_rewrite em uso é:
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
A variável $ _GET ['url'] está definida, portanto a regra deve estar funcionando.
Para deixar claro, nesta fase, eu segui a solução alternativa auto_prepend_file que mencionei inicialmente.