2010-08-26 12 views
7

Przyszło coś dziwnego podczas migracji na mój nowy serwer.Zdolność do echa przed nagłówkiem()

Mam skrypt, który przekieruje użytkowników do innej strony internetowej na podstawie określonych warunków. To, co robiłem, polega jednak na "przekierowaniu ...", a następnie użyciu funkcji header() w celu rzeczywistego przekierowania. Oto jak wyglądał kod:

if($condition) { 
    echo 'Redirecting...'; 
    header('Location: ' . $url); 
} 

Teraz dopiero zauważyłem, że jest to błędne po przełączeniu na naszym nowym serwerze, przetestował go i zobaczył, że to nie tylko przekierowanie przekierowanie wyjścia ... i kiedyś przeszukałem go, nauczyłem się, że nie możesz mieć żadnego wyjścia (chyba że używasz ob_start etc) przed użyciem funkcji header().

Pytanie brzmi: dlaczego ten kod, który NIE powinien działać w ŻADNEJ instalacji PHP, działa na moim starym serwerze? Przekieruje z echa przed header() bez problemu.

Dzięki!

+1

Wierzę, że można włączyć buforowanie wyjścia domyślnie w php.ini. Wadą jest to, że całe żądanie musi się zakończyć, zanim jakiekolwiek dane wyjściowe zostaną przesłane do użytkownika. – meagar

Odpowiedz

9

Możliwe było buforowanie wyjścia na starym serwerze: buforowanie wyjściowe nie wyświetli niczego, dopóki skrypt nie zostanie uruchomiony. Pozwala to uzyskać nagłówek przed faktycznym wyjściem (ponieważ wie, że nagłówki powinny zostać wysłane jako pierwsze).

Jeśli to ma sens.

+0

Dziękujemy! to wydaje się być problemem po prostu zaznaczone php.ini na starym serwerze i output_buffering jest ustawione na 4096, więc było włączone :) –

1

Działa na starym serwerze, ponieważ domyślnie buforowanie wyjściowe zostało ustawione przez php.ini.

+0

Dzięki! Doceniam to! –

4

Być może Twoja stara instalacja miała wartość output_buffering zdefiniowaną jako prawda w pliku php.ini. To opóźniło wyjście, pozwalając ustawić nagłówki nawet po usłyszeniu echa.

+0

Dzięki! Doceniam to! –

3

Musisz mieć włączone buforowanie, nawet jeśli sam nie zrobiłeś tego aktywnie. output_buffering = On w php.ini?

+0

Dzięki! Doceniam to! –

0

Stary serwer prawdopodobnie domyślnie buforował wyjścia. Oznaczało to, że od razu nie będzie to echo, ale raczej poczekaj, aż cały skrypt się zakończy, a następnie echo. Oznacza to również, że nagłówek zostanie wysłany przed echo (ponieważ był buforowany), a zatem nie spowoduje ostrzeżenia.

Na nowym serwerze najprawdopodobniej domyślnie nie włączono buforowania wyjściowego, co oznaczałoby, że od razu byłby on echo, bez buforowania go, a zatem zostałby wysłany przed nagłówkami i wygenerowałby ostrzeżenie .

chciałbym zachęcić do korzystania headers_sent() aby sprawdzić, czy nagłówków zostało wysłane przed użyciem headers() po echo, tak:

<?php 
echo "Foobar\n"; 
if(!headers_sent()) 
    header('Location: /helloworld.php'); 
?> 

Powiązane linki:

+0

Dziękuję za pomoc, doceniam to :) –

Powiązane problemy