Posso definir globalmente $ _SERVER ['REDIRECT_URL'] antes da execução do script?


8

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.


-1 por não mostrar a devida diligência. Uma pesquisa rápida no Google não substitui a leitura da documentação. Antes de atualizar sistemas ou códigos, você deve entender o que mudou, pelo menos na medida em que afeta seus sistemas ou projetos.
John Gardeniers 19/07/2012

Desculpas por não ser claro; Eu li a documentação da melhor maneira que pude ver. Então, recorri ao Google quando me deparei com algo que não conseguia explicar. A configuração está em uma máquina separada e, durante os testes pré-movimentação, descobri o problema acima. No entanto, encontrei um erro que cometi, por isso vou atualizar a pergunta.
Barry

é realmente do seu interesse e do nosso melhor se você nos contar essas coisas com antecedência. Eu inverti meu voto.
319 John John Gardeniers

Você pode nos fornecer mais informações sobre a configuração anterior e nova do servidor? A configuração de REDIRECT_URL no PHP vem da variável de ambiente SCRIPT_URL no apache, eu acho, mas há muitas coisas que podem modificar o comportamento dessa importação (por exemplo, suPHP, mecanismos de empacotamento, instruções AddTypeHandler, etc.).
precisa saber é o seguinte

Respostas:


3

REDIRECT_URL é definido apenas pelo servidor da web Apache e apenas em determinadas circunstâncias . Provavelmente não é algo em que seu código deva confiar. Até onde eu sei, a melhor solução seria consertar o código PHP com erros; você não pode realmente forçar que isso seja sempre definido no Apache.


Obrigado pela resposta, embora eu não tenha conseguido ver nada no link relacionado ao meu problema, infelizmente. Eu não acho que um ErrorDocument externo esteja envolvido nisso. Eu gostaria de poder alterar o código existente, mas essa não é uma opção neste momento.
Barry

O ponto é que REDIRECT_URL é definido apenas durante o processamento do ErrorDocument. Isso significa que seus scripts PHP foram carregados como ErrorDocuments na configuração original e quem os escreveu contou com esse comportamento. Agora que isso não está acontecendo, os scripts quebram.
22412 Michael JacksonJul

Não há definições de ErrorDocument em uso, e não consigo ver como o mod_rewrite RewriteRule (adicionado acima) envolve uma. Não estou falando com você sobre a garantia de REDIRECT_URL, mas não consigo encontrar nenhuma documentação relevante sobre o motivo.
Barry

Eu o vinculei acima na minha resposta. Se você precisar de algo mais, precisará ler o código-fonte do Apache. De qualquer forma, lembre-se de aceitar a resposta que resolveu seu problema clicando no contorno da marca de seleção ao lado e seja bem-vindo ao Server Fault.
Michael Hampton

0

De acordo com a documentação do PHP:

$ _SERVER é uma matriz que contém informações como cabeçalhos, caminhos e locais de script. As entradas nesta matriz são criadas pelo servidor da web. Não há garantia de que todo servidor da web forneça qualquer um desses; os servidores podem omitir alguns ou fornecer outros não listados aqui. Dito isto, um grande número dessas variáveis ​​é contabilizado na especificação »CGI / 1.1 , portanto, você deve esperar isso.

Portanto, parece que nem todas as $_SERVERvariáveis ​​superglobais são tão independentes de plataforma quanto seria de esperar. $_SERVER['REQUEST_URI']parece ser um desses valores que é definido consistentemente por todos os principais servidores da web; portanto, você pode tentar usá-lo.


Obrigado por isso, mas eu já estava ciente de que às vezes isso está definido, e às vezes não. O que eu esperava era uma maneira de influenciar ativamente quais variáveis ​​são definidas para minha configuração específica, pois não consigo encontrar nenhuma documentação sobre detalhes com base em minha configuração (ou seja, como eu saberia antes da criação de um ambiente).
Barry

0

Para imagens ausentes em um de nossos projetos que foram redirecionados para o index.php, usei essa correção:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Se você quer uma solução global, acho que você tem que usar explode () etc e usar outra variável, como $ _SERVER ['REQUEST_URI'].


-1

Você pode definir um arquivo de pré-adição automática do php para incluir um pequeno trecho de código PHP que define essa variável.


Na minha pergunta, eu já identifiquei isso como o curso de ação que eu faria se não fosse possível. Também foi o que acabei fazendo, conforme a edição que fiz antes de você responder.
Barry

Desculpas, não me lembro de ter visto a edição antes de postar; pode ter sido que comecei a responder antes de você fazer a edição, mas não tenho certeza, pois a edição subsequente removeu o carimbo de data da edição original: / Eu também deveria ter deixado mais claro que o que eu estava sugerindo é provavelmente a maneira correta de consiga o que procura, em vez de um "substituto". Você pode usar os sinalizadores [E: blah = blah] nas regras de reescrita para definir variáveis ​​de ambiente arbitrárias para buscar dentro do arquivo de pré-inclusão, que é mais limpo do que usar as variáveis ​​GET para passar coisas do mecanismo de redirecionamento para o seu código.
Jon Kloske

E por "provavelmente correto", quero dizer que foi assim que fiz exatamente isso em vários lugares no passado.
Jon Kloske
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.