Заголовок отправляется — я споткнулся о различные ошибки, которые вы можете make с использованием header(), например, вывод перед предыдущим вызовом. Я разобрался с такими проблемами, например, теперь я использую ob_start() и ob_clean() перед вызовом функции header().
Теперь мне нужно понять, почему мой браузер/сервер/что-то еще не показывает мне страницу с ошибкой.
Вот HTML-страница, которую я использую для тестирования:
Код: Выделить всё
Header Testing
Вот заголовок из журнала доступа:
Код: Выделить всё
127.0.0.1 - - [11/Feb/2012:19:14:35 -0600] "POST /commentprocessing.php HTTP/1.1" 403 266 "http://127.0.0.1/submitcomments.php" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 ( .NET CLR 3.5.30729; .NET4.0C)"
Код: Выделить всё
Header Testing
Есть ли способ автоматически отображать страницу с ошибкой на основе кода возврата в заголовке?
Для такого рода тестирования я запускаю сервер Abyss локально. У меня есть специальная страница ошибок, определенная в Abyss для ошибок 403, и я проверил, что она написана правильно в настройках Abyss и что страница действительно существует.
Эта страница не отображается заголовок с кодом ответа 403, который, похоже, отправляется правильно, поскольку отображается в журнале доступа.
Может ли это быть проблемой при использовании Abyss локально, а не на сервере моей хостинговой компании?
Есть предложения?
РЕДАКТИРОВАТЬ***
tftd,
Если то, что вы сказали, правда, что сервер игнорирует мой код, почему в журнале доступа он записывается с указанным мной кодом?
И, если то, что вы сказали о невозможности изменить ответ код, зачем вообще использовать оператор header() ИЛИ почему в документации четко не указано, что такие вещи, как использование ob_start() и ob_clean(), не помогут обойти это.
Я видел более чем в одном месте ссылки на использование ob_start() и ob_clean() для удаления сгенерированного вывода, чтобы вызов header() работал.
Хира,
Спасибо, по крайней мере, за то, что показали мне, что материал может быть размещен над оператором doctype и при этом оставаться эффективным. Я бы не подумал, что это сработает. Итак, спасибо вам за это.
Однако ваш пример просто выводит именно то, что было бы выведено, если бы вы удалили весь PHP и оставили только HTML.
Я удалил ваш вызов загрузки, чтобы исключить ошибку «функция не определена», которая могла возникнуть, поскольку вы не включили скрипт, содержащий указанную функцию.
Следующий результат даст тот же результат, что и ваш пример:
Код: Выделить всё
This is some text
Код: Выделить всё
>
This is some text
>
Кроме того, зачем получать содержимое буфера и обернуться и повторить это? Что это демонстрирует, кроме вызова ob_get_clean(), который возвращает содержимое буфера, стирает его и, в отличие от ob_clean(), удаляет буфер, и если вы хотите отправить только что стертые выходные данные, вам придется использовать ob_get_clean( ) и сохраните его, а затем используйте echo, чтобы записать его.
Разве это не демонстрирует, что вам лучше сделать что-нибудь, чтобы сохранить содержимое буфера, если вы хотите выполнить вывод перед вызовом чистой функции?
И ob_end_flush() задокументирован, везде, где я с ним сталкивался, поскольку при автоматическом вызове скрипт/страница завершается . Зачем демонстрировать что-то, что происходит автоматически, если только вы не показали, что с вызовом сброса того или иного типа без out результат будет одинаковым, при условии, что после вызова сброса не создается дополнительный вывод.
Похоже, ваш вызов ob_end_clean() вообще ничего не демонстрирует, хммм, или нет?
Так зачем же генерировать выходные данные, получать их из буфера, стирать и удалять буфер, а затем выводить сохраненное содержимое? Что именно это демонстрирует? Как сделать что-то простое запутанным и странным способом?
Теперь, если вы хотите продемонстрировать разницу между размещением ob_start() на выходе и тем, что ob_clean () удаляет предыдущий вывод, почему бы не начать с такого примера:
Код: Выделить всё
This is some text
Код: Выделить всё
It was the best of times, it was the worst of times.
Код: Выделить всё
This is some text
Код: Выделить всё
This is some text
This is some textIt was the best of times, it was the worst of times.
Код: Выделить всё
This is some text
Код: Выделить всё
This is some text
This is some text It was the best of times, it was the worst of times.
Опять же, ваш пример делает именно то, что делал бы HTML, если бы PHP не присутствовал.
Если вы говорили, что должны использовать ob_start, ob_get_clean(), echo и ob_end_flush() для вывода вывода — ну, я ожидал этого от программиста, который знал только о ob_get_clean() и ob_end_flush().
Я ожидал это от программиста, который по какой-то причине решил, что он или она должен взять на себя ответственность за передачу результатов пользователю; что им пришлось взять содержимое буфера и использовать echo, чтобы отправить его пользователю.
Я просто не понимаю, почему вы написали этот пример именно так или что, помимо размещения ob_start() вы пытались продемонстрировать.
Что касается «реального мира» — в реальном мире программисты должны понимать особенности языка, которые они используют. использование и любые альтернативы им. Ожидается, что они будут понимать такие концепции, как PHP, автоматически отправляющий любые сгенерированные выходные данные, без необходимости вызывать программисту функцию, чтобы передать их пользователю.
Вы назвали мое использование буферизация неправильная. Ну, это было, что касается размещения вызова ob_sat(), но все остальное в порядке.
Если вы разместили свой пример в каком-то вопросе , мой ответ был бы таким:
Нет абсолютно никакой необходимости использовать PHP для достижения того, что вы пытаетесь сделать. Уберите PHP и используйте обычный HTML — результат будет таким же.
Извините, но этот пример, за исключением размещения ob_start, не демонстрирует ничего, кроме странный и запутанный способ передать HTML-код пользователю.
Возможно, вы просто не нашли время обдумать лучший пример для использования, после того как сначала решили, какой пример должен был продемонстрировать.
Если мы проигнорируем тот факт, что пример не делает ничего, что делает простой HTML, и речь идет о выводе буфера запутанным способом, все ваши Пример дал мне понять одну вещь: вы можете поместить что-то перед типом документа, и оно будет «обработано». И я благодарен, что вы указали мне на это.
mc_kennedy,
Я прочитал страницу, на которую вы мне указали, но не думаю, что это применимо, поскольку первая строка вывода не начинается с HTTP/, как указано на странице. .
Я основываюсь на том, что вижу в окне просмотра исходного кода в своем браузере. Первая строка — это либо тип документа, либо
Для всех в целом --
Похоже, некоторые люди говорят, что вам необходимо иметь вызов header() в в самом верху файла, и это позволит вам правильно отправлять коды ответов.
Ну, я попробовал это, с PHP в самом верху и последующим стандартным HTML, и я не вижу никакой разницы.
Я ошибаюсь, думая, что сервер будет реагировать, скажем, на 200 по-разному, чем на 403?
Неужели у меня все не так, и то, что я ожидаю - чтобы сервер каким-то образом отреагировал на ошибку 403 или 500, - это просто то, чего не существует?
Если используемый мной подход приводил к игнорированию вызова header(), почему в журнале отображается код, который я отправлял?
Теперь я понимаю, что должен сам генерировать страницы ошибок, как я подозревал (ну, более чем подозревал, скорее предполагал, что это необходимо.)
Но Ожидаю ли я, что сервер будет реагировать на разные коды ответов по-разному, а этого просто не происходит?
Боб
Подробнее здесь: https://stackoverflow.com/questions/924 ... r-function
Мобильная версия