2015-09-16 33 views
5

Ho aggiornato di recente uno dei miei server e da allora, ho un problema con alcuni comandi PHP specifici (vedi sotto). Credo che sia un problema di configurazione, ma ho già esaminato un paio di cose e non ne so più. Così forse uno di voi ha una buona idea:file_exists o getimagesize funzionano solo con percorsi di file assoluti locali, ma non con URL in PHP

Sto usando il seguente codice al fine di visualizzare sia un logo standard su un sito Intranet o un definito logo utente:

if(L_HEADER) { 
    $logo = L_HEADER; 
} 
else { 
    $logo = 'logo.png'; 
} 
$properties = getimagesize(CONFIG_URL . 'images/' . $logo) 

L_HEADER e CONFIG_URL sono costanti con i valori predefiniti (un altro file):

  1. L_HEADER contiene "opb_beta.png"
  2. CONFIG_URL contiene "http://billing.intranet.opb/"

Concatenazione funziona correttamente, che è anche confermata dal messaggio di errore del file di log di Apache:

PHP Warning: getimagesize (http://billing.intranet.opb/images/opb_beta.png): failed to open stream: HTTP richiesta non riuscita! HTTP/1.1 404 Not Found
in /var/www/billing/templates/header.inc.php on line 42

Quindi la prima conclusione ovvia sarebbe: il percorso è sbagliato. Ma non è, credimi. L'ho controllato come 1.000 volte. In effetti, la prima curiosità è che l'immagine viene visualizzata e fa riferimento correttamente un paio di righe più in basso nel codice dello stesso file:

echo '<img src="' . CONFIG_URL . 'images/' . $logo . '" 
    width="' . $properties[0] . '" height = "' . $properties[1] . '" />"; 

Come ottengo l'errore citato sopra, l'altezza e la larghezza sono "0 ", ma guardando il codice sorgente, l'URL va bene, l'accesso manualmente apre l'immagine e quando si sostituiscono larghezza e altezza con valori manuali, l'immagine viene visualizzata bene.

più curioso però (e anche il mio attuale Finx), quando si cambia il getimagesize al seguente, funziona bene:

$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo); 

io dire che sto usando reindirizzamento di Apache; questo è il motivo per cui nell'URL non vedi "public_html", mentre nel percorso assoluto del secondo esempio lo vedi.

Lo stesso accade con "file_exist". L'URL non funziona, il percorso locale assoluto per lo stesso file lo fa.

Un'altra curiosità: in un altro pezzo di codice, sto verificando online gli aggiornamenti. Lì, sto usando un URL "reale" pubblico con file_exists e fopen. Mi sembra che questa e funziona perfettamente bene:

if(file_exists('http://desk.co.cr/df_stable.txt') { 
    if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) { 
    // some other code 
    } 
} 

Ora, le cose che ho già controllato:

  • I permessi dei file sono impostate correttamente, per tutto il percorso, con www-data di essere gruppo e proprietario della tutti i file e accesso in lettura e scrittura per il file immagine
  • allow_url_fopen in "On".
  • open_basedir è impostato su "nessun valore" e non c'è override nelle definizioni degli host virtuali di Apache.
  • il file esiste definitivamente e la sintassi + percorso sono corretti.

Alcune informazioni di fondo:

  • Server è in esecuzione su Ubuntu 14.04 LTS
  • Apache 2.4.7
  • PHP 5.5.9

Per ora, io sono fuori idee.

+0

hai guardato al access_log per vedere quale URL è stato realmente richiesto? forse hai una riscrittura impeccabile. –

+0

File host del server forse? Cosa succede quando si esegue un nslookup sul server per il dominio? –

+0

@MarcB Sì, ho controllato access_log e error_log. Entrambi mostrano un URL corretto. Ho anche copiato + incollato in un browser per controllare e l'immagine si presenta bene. – Sebastian

risposta

2

Sepolto nella tua domanda è questo indizio vitale che hai già trovato:

Un'altra curiosità: in un altro pezzo di codice, sto controllando on-line per gli aggiornamenti. Lì, Sto usando un "vero", URL pubblico

Così, l'URL che sta fallendo è a un dominio non pubblico, che il PC è stato configurato in modo da guardare in alto per l'indirizzo IP corretto. Molto probabilmente questo è stato fatto eseguendo un server DNS locale o configurando il file "hosts" del PC per codificare l'indirizzo per quel dominio.

Quando si richiede l'URL dal server stesso, tuttavia, è in gioco una configurazione DNS completamente diversa, quindi probabilmente semplicemente non sa dove si trova quel server, anche se è esso stesso! È necessario configurare le impostazioni DNS del server o /etc/hosts in modo che corrispondano a quelle del tuo PC.

Una possibilità correlata è che il server è configurato con la stessa ricerca di indirizzi, ma il router non gli consente di connettersi a se stesso in questo modo. Un modo per aggirare è quello di puntare la voce del file hosts su 127.0.0.1 e configurare Apache in modo che corrisponda.

Se è possibile ottenere una riga di comando sul server, si potrebbe provare:

nslookup billing.intranet.opb 
# if that returns the right IP address, see if it's reachable: 
ping billing.intranet.opb 
# and if it's the right server, it will be listening on port 80: 
telnet billing.intranet.opb 80 
# telnet will either time out, or connect and give you a prompt 

Se telnet si connette, è possibile anche scrivere una richiesta HTTP manualmente (una riga vuota completa la richiesta, non fare digitare troppo a lungo, o il server verrà salvato) ad esempio:

HTTP/1.1 HEAD/
Host: billing.intranet.opb 
+0

Hai ragione - c'è un dnsmasq in esecuzione qui che si occupa di quali richieste uscire e cosa stare dentro. I file "host" con hardcoded non vengono utilizzati. Il tuo ultimo commento su potrebbe essere una possibilità, ma non ho idea di come controllarlo. – Sebastian

+0

@Sebastian Ho aggiunto un paio di comandi diagnostici – IMSoP

+0

@IMoSP Ci scusiamo per la risposta tardiva, ma qui ci vado. Prima di tutto grazie per il vostro feedback. Ho passato il comando diverso e 'nslookup' restituisce l'IP corretto, come anche' ping'. 'billing.intranet.opb' è disponibile anche tramite' telnet' e le intestazioni vengono restituite correttamente (ho provato un normale 'HTTP' e un' GET'). – Sebastian

Problemi correlati