Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сгенерировать ошибку HTTP в коде 
:(
    Опции темы
Royan
Дата 16.11.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Хочу реализовать внутри кода возможность направления пользователя на страницу с ошибкой, скажем в ответ, на то что он ввел несуразные параметры в строке адреса.

Возьмем самый простой случай, например, адрес форма PHP выглядит так: http://forum.vingrad.ru/forum/php-basics.html если пользователь вводит http://forum.vingrad.ru/forum/blah-blah-blah.html я хочу его автоматически перенаправить на страницу 404-й ошибки.

Изначально я планировал это сделать примерно так: 

Код

header('HTTP/1.0 404 Not Found'); 


Но браузер почему-то на этот заголовок никак не реагирует (никакого output'а до этого заголовка не происходит) Может у меня что-то не так настроено в Apache?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
getme
Дата 16.11.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 12.9.2008

Репутация: -2
Всего: -2



а как браузер должен реагировать? вывести страницу 404 на этот заголовок?

PM MAIL   Вверх
unicross
Дата 16.11.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



Royan, в файл .htaccess достаточно добавить директиву обработки ошибки 404 и перенаправить на страницу обработки.
Код

ErrorDocument 404 /err404.php


PM MAIL WWW   Вверх
solenko
Дата 16.11.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Royan, насколько я понимаю, апач думает что страница таки найден (ведь так и есть) и не анализирует хедеры которые вы отдаете. Дефолтная же страница ошибки показывается именно вебсервером, а не браузером. Соответственно, ваш скрипт работает корректно (чтобы убедится проверте с пом. прокси или того же TamperData). Останось только отдать контент страницы ошибки.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 17.11.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



да, но страница 404 зависит от типа браузера. если давать свой контент, то это будет просто сообщение об ошибке.

а можно ли как-то без использования директив .htaccess заставить выдать ошибку 404?
PM MAIL WWW   Вверх
ZlojEzh
Дата 17.11.2008, 01:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 10
Всего: 15



Цитата(bars80080 @  17.11.2008,  00:23 Найти цитируемый пост)
да, но страница 404 зависит от типа браузера. если давать свой контент, то это будет просто сообщение об ошибке.

не совсем так
обычно браузеры получая какой-либо контент после заголовка 404, отображают его
(некоторые проблемы с этим есть у ие, ему, кажется, требуется определенный размер контента)

а для того, чтобы отдать нужный заголовок, даже если он уже был ранее установлен, нужно указать доп. параметры
Код

header('HTTP/1.0 404 Not Found', true, 404);

PM MAIL ICQ   Вверх
unicross
Дата 17.11.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



Цитата(bars80080 @  17.11.2008,  00:23 Найти цитируемый пост)
а можно ли как-то без использования директив .htaccess заставить выдать ошибку 404?

Обычно ошибку 404 обрабатывают, а не генерируют... Отправьте клиента на неработающий ресурс smile 
Код

<?php
header("Location: http://1234567891.ru/");
?>


ZlojEzh, У меня этот код
Код

header('HTTP/1.0 404 Not Found');

без проблем меняет заголовок ответа сервера.
Код

HTTP/1.0 404 Not Found
Date: Sun, 16 Nov 2008 22:16:17 GMT
Server: Apache/2.2.9 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Content-Length: 0
Connection: close
Content-Type: text/html; charset=windows-1251
Content-Language: ru


PM MAIL WWW   Вверх
bars80080
Дата 17.11.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(ZlojEzh @  17.11.2008,  00:05 Найти цитируемый пост)
header('HTTP/1.0 404 Not Found', true, 404);

ИЕ6 и опера проглотили, а ФФ выдаёт чистую страницу



Цитата(unicross @  17.11.2008,  00:31 Найти цитируемый пост)
Обычно ошибку 404 обрабатывают, а не генерируют... 

в том то и дело, что обычно. а вот как сделать именно так как мне требуется?
Цитата(unicross @  17.11.2008,  00:31 Найти цитируемый пост)
Отправьте клиента на неработающий ресурс 

тогда клиент увидит переадресацию

фишка именно в симуляции настоящей ошибки 404, чтобы интервент, вздумавший поиграться с адресами увидел фигу, но думал, что это не я ему показываю, а что там просто ничего нет.
PM MAIL WWW   Вверх
skyboy
Дата 17.11.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(bars80080 @  17.11.2008,  09:08 Найти цитируемый пост)
ИЕ6 и опера проглотили, а ФФ выдаёт чистую страницу

не "проглотили", а показали "friendly error pages". в MSDN читал статью, что, мол, если длина контента страницы с ошибкой(500, 404, 403 и тыды) короче некоего размера, то показывается собственный(браузерный) вариант страницы. Естественно, если на сгенерированной сервером были какие-то дополнительные опции, типа списка ссылок на похожие страницы(для чего, собственно, удобнее использовать динамику с РНР и отдачей заголовка, чем статику на HTML), то браузер со своими "дружественными" страницами подкладывает свинью и разработчику, и конечному пользователю. И отменить такую обработку можно, только "отдавая страницу достаточной длины".

Добавлено через 2 минуты и 17 секунд
Цитата(ZlojEzh @  17.11.2008,  00:05 Найти цитируемый пост)
некоторые проблемы с этим есть у ие, ему, кажется, требуется определенный размер контента

так точно. причем в MSDN указания конкретного минимального размера я не нашел :(
PM MAIL   Вверх
bars80080
Дата 17.11.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



то есть чисто из пхп это невозможно?

а путём сервера? имеется ввиду опять же, не обработка и выдача своей страницы, а именно чистая симуляция 404 (обман браузера)
PM MAIL WWW   Вверх
skyboy
Дата 17.11.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(bars80080 @  17.11.2008,  09:38 Найти цитируемый пост)
то есть чисто из пхп это невозможно?

что "невозможно"?
отдать заголовки "404 Not found"? Да ради Бога - отправляются они. и принимаются. Почему в Firefox не выводится браузерная "friendly error page" - не знаю(и хорошо: хоть один браузера регирует вменяемо). Поищи адреса, по которым выводится браузераная страница ошибки, а не собственная страница сайта. Подсмотри в заголовки. Может, там надо ещё Content-Length: 0, чтоб был. Или ещё чего. И отправь такие же заголовки на своем сайте.
PM MAIL   Вверх
solenko
Дата 17.11.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



bars80080, да что значит "невозможно"? Невозможно вместе с статусом отдать некоторую страницу на которой будет сказано что страница не найдена? Клиенту по большому счету плевать на статус страницы -- ему важен контент, который он увидит. Стастуы в большей степени для поисковиков нужны. И, если клиент увидит не дефолтную браузерную "Not found", а некую другую (например http://yandex.ru/sdfsd), то в этом нет ничего страшного


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 17.11.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



хм, сейчас в самом деле вляделся в content-length, оказалось, что в случае реально не существующей страницы сервер присылает 288 байт, содержащие:
Код

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /xeim/123.php was not found on this server.</p>
<hr>
<address>Apache/2.2.9 (Win32) PHP/5.2.6 Server at cupa Port 80</address>
</body></html>

, которые в ФФ отображаются, а в ИЕ и опере подставляется собственный вариант

соответственно мне надо выкидывать этот текст

спасибо







Цитата(solenko @  17.11.2008,  12:00 Найти цитируемый пост)
И, если клиент увидит не дефолтную браузерную "Not found", а некую другую (например http://yandex.ru/sdfsd), то в этом нет ничего страшного 
вопрос не в клиенте, а мерзком пакостнике, который начинает шарить недопустимыми url по сайту. согласно теории обмана, лучше не указать злодею, что его попытки пресечены, а дать ему понять, что ничего здесь нет вообще

Добавлено через 1 минуту и 7 секунд
Цитата(solenko @  17.11.2008,  12:00 Найти цитируемый пост)
Невозможно вместе с статусом отдать некоторую страницу на которой будет сказано что страница не найдена? 

раньше думал, что сервер сам ещё добавляет заголовков и как-то обозначает, что страница всё же найдена. ан нет оказывается
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.