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

8

Estou no processo de migrar muitos sites de uma configuração antiga para uma nova. Cada site é baseado em uma base de código similar (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 ter que editar o código em cada site, então eu vou definir um auto_prepend de PHP global, se necessário, mas o ideal é que eu gostaria de consertar a configuração do servidor e ter isso configurado em primeiro lugar.

Potencialmente relacionado: agora também tenho algumas novas variáveis $ _SERVER, a saber, REDIRECT_SCRIPT_URL e REDIRECT_REDIRECT_SCRIPT_URL. Esses parecem ter os dados corretos que desejo para o REDIRECT_URL, mas também parecem indicar que há dois redirecionamentos internos que não ocorreram antes - as pesquisas no Google por REDIRECT_REDIRECT_SCRIPT_URL retornam apenas saídas aleatórias de var_dump. O SCRIPT_URL é o novo REDIRECT_URL?

Editar 1

Verificando novamente REDIRECT_URL é (agora) definido, mas sempre para 'index.php' (o alvo mod_rewrite) em vez do URL digitado esperado. Eu tenho recorrido a um PHP usando auto_prepend_file para definir manualmente a variável necessária.

Não sei como perdi a primeira vez, mas fiz várias alterações nesse meio tempo, então acho que há uma chance de não estar lá. Desculpas se isso enganar alguém.

Editar 2

Para endereçar 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, então a regra deve estar funcionando.

Para ser claro, neste estágio, fui com a solução auto_prepend_file que mencionei inicialmente.

    
por Barry 18.07.2012 / 11:11

4 respostas

3

REDIRECT_URL é definido apenas pelo servidor da Web Apache e apenas em determinadas circunstâncias . Provavelmente não é algo que seu código deve confiar. Tanto quanto eu posso dizer, a melhor solução seria corrigir o código PHP com bugs; você não pode realmente forçar isso a ser sempre definido no Apache.

    
por 27.07.2012 / 06:10
0

De acordo com a documentação do PHP:

$_SERVER is an array containing information such as headers, paths, and script locations. The entries in this array are created by the web server. There is no guarantee that every web server will provide any of these; servers may omit some, or provide others not listed here. That said, a large number of these variables are accounted for in the » CGI/1.1 specification, so you should be able to expect those.

Assim, parece que nem todas as variáveis% super_globais são tão agnósticas quanto a plataforma como seria de se esperar. $_SERVER parece ser um desses valores que são consistentemente definidos por todos os principais servidores da Web, portanto, convém usar isso em seu lugar.

    
por 18.07.2012 / 23:29
0

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

url: link ;

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

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

    
por 05.01.2016 / 13:45
-1

Você pode definir um arquivo auto-prepend do php para incluir um pequeno trecho de código PHP que define esta variável.

    
por 27.07.2012 / 05:57