PHP 8.2 на не существующую страницу вывожу шаблон PHP: else { header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); $title="404 Страница не найдена"; $description="Страница не найдена 404 Not Found"; $inc_page="inc/404.php"; }; вот в нем все работает и визуально страница оформлена как 404 и заголовок и описание все верно. А проверяю на ответ сервера - код ответа 200 Код (Text): Код статуса HTTP 200 OK Время ответа сервера 61 мс Кодировка UTF-8(unicode-1-1-utf-8, UTF8) Размер страницы 12,59 КБ Server: nginx-reuseport/1.21.1 Date: Tue, 25 Jul 2023 10:34:14 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Keep-Alive: timeout=30 Vary: Accept-Encoding X-Powered-By: PHP/8.2.7 Content-Length: 12888 причем побывал по разному менял на header("HTTP/1.0 404 Not found"); все равно так же ответ 200 я так понимаю у меня проблема в .htaccess Код (Text): RewriteEngine on Errordocument 404 /404.php RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^(robots\.txt)$ robots.php [L] RewriteRule ^(sitemap\.xml)$ sitemap.xml.php [L] RewriteRule ^(sitemap-obj\.xml)$ sitemap-obj.xml.php [L] RewriteRule ^(yandex\.xml)$ yandex.xml.php [L] RewriteRule ^(yandex-all\.xml)$ yandex.xml.all.php [L] RewriteRule ^(yml\.xml)$ yml.all.php [L] RewriteRule ^(yml-fat\.xml)$ yml.fat.php [L] RewriteRule ^(avito\.xml)$ avito.php [L] RewriteRule ^(avito\.jpg)$ avito-jpg.php [L] RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*) index.php?do=/$1 вся система самописная но почему то игнорируется правила установки ответа header("HTTP/1.0 404 Not found"); подскажите пожалуйста в чем может быть причина?
я в таких случаях отлаживаю от простого к сложному. например, убрал бы всё из файла, оставил бы только Код (Text): <?php header('HTTP/1.0 404 Not Found'); проверил результат, усложнил бы до Код (Text): <?php header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); проверил результат, усложнил бы еще... проверил ... возможно у тебя где-то до этого происходит паразитический "Header already sent" т.е. что-то уже выведено. поэтому твой header не работает! отлаживай.
да походу мусор какой то был. скопировал другой код такой же и все заработало header('HTTP/1.1 404 Not Found', true, 404); спасибо за совет!
@don.bidon заголовки отсылаются до вывода. Если сделать echo, то первым делом неявно вышлется статус 200 и только следом уже контент из echo. Отсюда эта вечная "проблема" с невидимым BOM в начале файла или с переводом строки после финального ?> в инклуде. Случайный высер в поток вывода — прощай контроль над заголовками.
Если бы там там был вывод, то PHP: header('HTTP/1.1 404 Not Found', true, 404); всё равно бы не отработал, ну и у нормальных людей ворнинг бы высыпал )
так он и не отработал. тема об этом ))) --- Добавлено --- только когда автор переписал всё начисто, неведомый вывод-по-неосторожности был ликвидирован и всё починилось. --- Добавлено --- или ты понял моё сообщение как "оставить всё на месте, а переписать только header()" ??? каждый раз удивляюсь как люди по разному читают один и тот же текст )))
боюсь уже продолжать эту тему ))) но исходная конструкция header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); рабочая. она прямо из документации по header. причина была где-то вне её.