Отправка "HTTP/1.0 200 OK" и PHP как CGI модуль

zEitEr

Новичок
Отправка "HTTP/1.0 200 OK" и PHP как CGI модуль

На сервере имеется обработчик ошибки 404, и естественно есть запись:

PHP:
ErrorDocument 404 /my_script.php
В скрипте отсылается заголовок:

PHP:
header("HTTP/1.0 200 OK");
Было установлено, что при использовании PHP (5.1.2, 4.4.2) как модуля CGI
заголовки передаются не верно, клиент не получает HTTP/1.0 200 OK,
а получает HTTP/1.1 404 Not Found

При этом для использования PHP как модуль есть такая запись:

PHP:
Action php5-script /cgi-bin/php5.1.2
AddHandler php5-script .php .php5
Можно ли это как-то вылечить? Т.е. что бы клиент все-таки получал бы HTTP/1.0 200 OK?
 

Кром

Новичок
Это ерунда какая-то. Обработчик уже сработал на 404 ошибку и просто перекидывает на указанный файл. При чем тут код 200 - непонятно.
 

zEitEr

Новичок
Ерунда - не ерунда.

Но нужно именно, чтобы клиент все-таки получал HTTP/1.0 200 OK.

Все это прекрасно работает при использовании PHP, установленным модулем для Апача.

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

З.Ы. Прошу не предлагать другие методы или обсуждать целесообразность данного подхода.
 

Кром

Новичок
Само решение - кривое.
Если тебе нужно получать всегда 200 OK, напиши правило с помощью mod_rewrite, тогда 404 ошибки у тебя не будет вообще. Любой запрос обрабатываешь как тебе надо.
 

alexhemp

Новичок
попробуйте отдать так
header("Status: 200 OK");
вместо
header("HTTP/1.1 200 OK");
 

kvf77

Red Devil
alexhemp

помоему када PHP как модуль у него проблемы с отсылом заголовков
 

zEitEr

Новичок
Автор оригинала: alexhemp
попробуйте отдать так
header("Status: 200 OK");
вместо
header("HTTP/1.1 200 OK");
Спасибо, сработало :)

Теперь, когда решение найдено, можно и пофилософствовать!

Автор оригинала: Кром
Само решение - кривое.
Хм, возможно, не самое лучшее (тем не менее, это решение описывается в последнем номере PHP!nside в статье "Создание дружественных URL" параграф "Использование своего обработчика 404 ошибки")!

Автор оригинала: Кром
Если тебе нужно получать всегда 200 OK, напиши правило с помощью mod_rewrite, тогда 404 ошибки у тебя не будет вообще. Любой запрос обрабатываешь как тебе надо.
Хорошо, mod_rewrite: Буду рад, если ты мне покажешь правило, которое будет работать по такому принципу:

Поиск файлика в DOCUMENT_ROOT согласно запросу, и если он не найден, тогда запрашивается обработчик, который из БД соберет страницу и отправит клиенту.
 

Кром

Новичок
>Хм, возможно, не самое лучшее (тем не менее, это решение описывается в последнем номере PHP!nside в статье "Создание дружественных URL" параграф "Использование своего обработчика 404 ошибки")!

И что там написано, что нужно на 404 ошибку выдавать код 200?

>Хорошо, mod_rewrite: Буду рад, если ты мне покажешь правило, которое будет работать по такому принципу:

Такое правило ты можешь найди как пример в любом руководстве по mod_rewrite
 

Кром

Новичок
Нет не надо. А чтобы понять где тут логика, нужно имееть хотя бы некоторое представление о HTTP протоколе.
 

zEitEr

Новичок
Автор оригинала: Кром
Такое правило ты можешь найди как пример в любом руководстве по mod_rewrite
Слушай, ты был прав, вот, что получается:

PHP:
RewriteEngine on
RewriteBase   /
RewriteRule   ^$   mysqcript.php   [L]
RewriteCond     %{REQUEST_FILENAME} !-d
RewriteCond   %{REQUEST_FILENAME}   !-f
RewriteRule   ^(.*)$ mysqcript.php
Смотрится симпатично :)

Как я понимаю, ты хотел сказать, что этот способ использовать лучше, чем мой, указанный раннее?
А как по ресурсоемкости? Этот вариант тоже выигрывает?
 

Кром

Новичок
>Как я понимаю, ты хотел сказать, что этот способ использовать лучше, чем мой, указанный раннее?

Нет, я хотел сказать, что тот вариант неправильный. Вообще неправильный. В корне.
404 код это одно 200 код - это другое. И имея в наличии такой инструмент как mod_rewrite, выдумывать какие-то кривые способы редиректа через 404 ошибку - неправильно.

>А как по ресурсоемкости? Этот вариант тоже выигрывает?

Разницы ты не заметишь. Такой вариант ответа тебя устроит? :)
 

zEitEr

Новичок
Автор оригинала: Кром
Разницы ты не заметишь. Такой вариант ответа тебя устроит? :)
Да и нет!

Да, потому что, как ты говоришь, что разница не заметная.

Нет, потому как нет никакой конкретики. В моем случае - это оттягивание неизбежного,
т.к. наступит момент, когда это будет очень важно: увеличение посещаемости сайта или
общее увеличение сайтов на одном сервере, работающих на этом коде.

В любом случае, время в обоих случаях можно замерить.

Спасибо всем, кто откликнулся на просьбу помочь :)

-~{}~ 22.03.06 11:14:

Тут возник новый вопрос:

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

в шелле можно выполнить php -v
но когда PHP стоит как модуль CGI, тут могут возникнуть проблемы.

Как это можно сделать? У кого-нибудь есть решение?

Или единственный возможный вариант - это брать информацию из phpinfo() и искать там строки:

Server API CGI

-~{}~ 22.03.06 11:36:

Получаем:

PHP:
<?
    ob_start();
    ob_implicit_flush(0);
    phpinfo(INFO_GENERAL);
    $contents = ob_get_contents();
    ob_end_clean();

   $IS_CGI_VER=strpos($contents, 'CGI');

?>
 

Кром

Новичок
>Нет, потому как нет никакой конкретики. В моем случае - это оттягивание неизбежного

Я думаю, что этот фрагмент mod_rewrite будет работать быстрее чем большинство селектов к базе в твоем коде. Так что не надо патетики. :)

>Как это можно сделать? У кого-нибудь есть решение?
php_sapi_name()
 

zEitEr

Новичок
Автор оригинала: Кром
Я думаю, что этот фрагмент mod_rewrite будет работать быстрее чем большинство селектов к базе в твоем коде. Так что не надо патетики. :)

php_sapi_name()
Спасибо :)
 
Сверху