Posso impostare $ _SERVER ['REDIRECT_URL'] a livello globale prima dell'esecuzione dello script?


8

Sto eseguendo la migrazione di molti siti da una configurazione server precedente a una nuova. Ogni sito è basato su una base di codice simile (ma purtroppo non identica), usando gli URL 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 funziona come un incantesimo, ma nella nuova configurazione $ _SERVER ['REDIRECT_URL'] non è più impostato e il codice non riesce a causa di una dipendenza da questa variabile globale.

Da quanto ho capito, questa variabile viene impostata da Apache quando si verifica un reindirizzamento. Ovviamente questo non sta accadendo ora, ma sto lottando per trovare la causa.

  • È l'aggiornamento di Apache o (suppongo) il passaggio da PHP FastCGI a PHP5-FPM?
  • Come posso recuperare questa variabile?

Preferirei davvero non dover modificare il codice su ogni sito, quindi imposterò un PHP auto_prepend globale se necessario, ma idealmente mi piacerebbe correggere la configurazione del server e avere questo set in primo luogo.

Potenzialmente correlati: ora ho anche un paio di nuove variabili $ _SERVER, ovvero REDIRECT_SCRIPT_URL e REDIRECT_REDIRECT_SCRIPT_URL. Questi sembrano avere i dati corretti che desidero per REDIRECT_URL, ma sembrano anche indicare che si stanno verificando due reindirizzamenti interni che non esistevano prima: Google cerca REDIRECT_REDIRECT_SCRIPT_URL restituisce solo output var_dump casuali. SCRIPT_URL è il nuovo REDIRECT_URL?

Modifica 1

Controllare di nuovo REDIRECT_URL è (ora) impostato, ma sempre su 'index.php' (il target mod_rewrite) invece dell'URL digitato previsto. Ho fatto ricorso all'uso di PHP auto_prepend_file per impostare manualmente la variabile necessaria.

Non sono sicuro di come mi sia perso la prima volta, ma nel frattempo ho apportato diverse modifiche, quindi suppongo che ci sia una possibilità esterna che non fosse lì. Ci scusiamo se questo induce in errore chiunque.

Modifica 2

Per affrontare le menzioni di ErrorDocument di seguito, la regola mod_rewrite in uso è:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

La variabile $ _GET ['url'] è impostata, quindi la regola deve funzionare.

Per essere chiari, in questa fase sono andato con la soluzione alternativa auto_prepend_file che ho citato inizialmente.


-1 per non aver dimostrato la dovuta diligenza. Una rapida ricerca su Google non sostituisce la lettura della documentazione. Prima di aggiornare i sistemi o il codice è necessario assicurarsi di comprendere cosa è cambiato, almeno per quanto riguarda i sistemi o i progetti.
John Gardeniers,

Chiedo scusa per non essere stato chiaro; Ho letto la documentazione nel miglior modo possibile. Poi ho fatto ricorso a Google quando mi sono imbattuto in qualcosa che non potevo spiegare. La configurazione è su una macchina separata e durante i test pre-spostamento ho scoperto il problema sopra. Tuttavia, ho riscontrato un errore che ho fatto, quindi aggiornerò la domanda.
Barry,

è davvero nel tuo e nel nostro interesse se ci dici queste cose in anticipo. Ho invertito il mio voto.
John Gardeniers,

Potete darci maggiori informazioni sulla configurazione del server precedente e nuova? L'impostazione di REDIRECT_URL in PHP proviene dalla variabile d'ambiente SCRIPT_URL in apache credo, ma ci sono molte cose che possono modificare il comportamento di quell'importazione (ad esempio, suPHP, motori di wrapping, istruzioni AddTypeHandler, ecc.).
Jon Kloske il

Risposte:


3

REDIRECT_URL è impostato solo dal server Web Apache e solo in determinate circostanze . Probabilmente non è qualcosa su cui il tuo codice dovrebbe fare affidamento. Per quanto ne so, la soluzione migliore sarebbe quella di correggere il codice PHP difettoso; non puoi davvero forzare questo ad essere sempre impostato su Apache.


Grazie per la risposta, anche se purtroppo non ho potuto vedere nulla su quel link relativo al mio problema. Non credo che un ErrorDocument esterno sia coinvolto in questo. Vorrei poter cambiare il codice esistente, ma non è un'opzione a questo punto.
Barry,

Il punto è che REDIRECT_URL è impostato solo durante l'elaborazione ErrorDocument. Ciò significa che i tuoi script PHP sono stati caricati come ErrorDocuments nella configurazione originale, e chiunque li abbia scritti ha fatto affidamento su questo comportamento. Ora che non sta succedendo, gli script si rompono.
Michael Hampton,

Non ci sono definizioni ErrorDocument in uso e non riesco a vedere in che modo mod_rewrite RewriteRule (aggiunta sopra) ne coinvolga una. Non sto discutendo con te sul fatto che REDIRECT_URL non sia garantito, non riesco a trovare alcuna documentazione pertinente sul perché.
Barry,

Ho collegato ad esso sopra nella mia risposta. Se hai bisogno di qualcosa di più, dovrai leggere il codice sorgente di Apache. Ad ogni modo, ricordati di accettare la risposta che ha risolto il tuo problema facendo clic sul contorno del segno di spunta accanto ad esso, e benvenuto su Server Fault.
Michael Hampton,

0

Secondo la documentazione di PHP:

$ _SERVER è un array che contiene informazioni come intestazioni, percorsi e posizioni degli script. Le voci in questo array sono create dal server web. Non vi è alcuna garanzia che ogni server Web fornirà uno di questi; i server possono ometterne alcuni o fornire altri non elencati qui. Detto questo, un gran numero di queste variabili sono considerate nella specifica »CGI / 1.1 , quindi dovresti aspettarti quelle.

Quindi sembrerebbe che non tutte le $_SERVERvariabili superglobali siano agnostiche come la piattaforma come ci si aspetterebbe. $_SERVER['REQUEST_URI']sembra essere uno di questi valori che viene costantemente definito da tutti i principali server web, quindi potresti provare a usarlo.


Grazie per questo, ma ero già consapevole che a volte questo è impostato, a volte no. Quello che speravo era un modo per influenzare attivamente quali variabili vengono impostate per la mia particolare configurazione, poiché non riesco a trovare alcuna documentazione su specifiche basate sulla mia configurazione (cioè, come avrei saputo in anticipo di una build di ambiente).
Barry,

0

Per le immagini mancanti in uno dei nostri progetti che sono stati reindirizzati a index.php ho appena usato questa correzione:

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

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

Se vuoi una soluzione globale, penso che devi usare explode () ecc. E usare un'altra variabile come $ _SERVER ['REQUEST_URI'].


-1

Puoi impostare un file di prepagamento automatico php per includere un piccolo frammento di codice PHP che imposta questa variabile.


Nella mia domanda l'ho già identificato come il modo di agire che intraprenderei se non fosse possibile. È stato anche quello che ho finito per fare, come per la modifica che ho fatto prima che tu rispondessi.
Barry,

Mi scuso, non ricordo di aver visto la modifica prima di aver pubblicato; potrebbe essere stato che ho iniziato a rispondere prima di aver effettuato la modifica, ma non posso esserne sicuro poiché la modifica successiva ha rimosso il datestamp di modifica originale: / Avrei anche dovuto chiarire che ciò che stavo suggerendo è probabilmente il modo corretto di ottenere ciò che stai cercando, piuttosto che un "fallback". È possibile utilizzare i flag [E: blah = blah] per le regole di riscrittura per impostare variabili di ambiente arbitrarie per poi recuperare all'interno del file di pre-inclusione che è più pulito dell'uso delle variabili GET per passare elementi dal motore di reindirizzamento al codice.
Jon Kloske il

E per "probabilmente corretto", voglio dire che è così che ho fatto questa cosa esatta in diversi posti in passato.
Jon Kloske il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.