PHP 8.2
на не существующую страницу вывожу шаблон
PHP:
else { $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); спасибо за совет!
скорее всего где-то выше 200-ый заголовок отдавался.
@don.bidon заголовки отсылаются до вывода. Если сделать echo, то первым делом неявно вышлется статус 200 и только следом уже контент из echo.
Отсюда эта вечная «проблема» с невидимым BOM в начале файла или с переводом строки после финального ?> в инклуде. Случайный высер в поток вывода — прощай контроль над заголовками.
Если бы там там был вывод, то
PHP:
всё равно бы не отработал, ну и у нормальных людей ворнинг бы высыпал )
так он и не отработал. тема об этом )))
— Добавлено —
только когда автор переписал всё начисто, неведомый вывод-по-неосторожности был ликвидирован и всё починилось.
— Добавлено —
или ты понял моё сообщение как «оставить всё на месте, а переписать только header()» ???
каждый раз удивляюсь как люди по разному читают один и тот же текст )))
автор упомянул только
PHP:
, я плясал от этого
боюсь уже продолжать эту тему ))) но исходная конструкция
header($_SERVER[«SERVER_PROTOCOL»].» 404 Not Found»);
рабочая. она прямо из документации по header. причина была где-то вне её.