неверный ответ (200) на установку ответа 404

PHP 8.2

на не существующую страницу вывожу шаблон

PHP:
  1. else {
  2.    
  3. header($_SERVER[«SERVER_PROTOCOL»].» 404 Not Found»);
  4. $title=«404 Страница не найдена»;
  5. $description=«Страница не найдена 404 Not Found»;
  6. $inc_page=«inc/404.php»;
  7. };

вот в нем все работает и визуально страница оформлена как 404 и заголовок и описание все верно. А проверяю на ответ сервера — код ответа 200

Код (Text):
  1. Код статуса HTTP    200 OK
  2. Время ответа сервера    61 мс
  3. Кодировка    UTF-8(unicode-1-1-utf-8, UTF8)
  4. Размер страницы    12,59 КБ
  5.  
  6.     Server: nginx-reuseport/1.21.1
  7.     Date: Tue, 25 Jul 2023 10:34:14 GMT
  8.     Content-Type: text/html; charset=UTF-8
  9.     Connection: keep-alive
  10.     Keep-Alive: timeout=30
  11.     Vary: Accept-Encoding
  12.     X-Powered-By: PHP/8.2.7
  13.     Content-Length: 12888

причем побывал по разному менял на header(«HTTP/1.0 404 Not found»);

все равно так же ответ 200

я так понимаю у меня проблема в .htaccess

Код (Text):
  1. RewriteEngine on
  2. Errordocument 404 /404.php
  3. RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
  4. RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
  5. RewriteCond %{HTTPS} off
  6. RewriteCond %{HTTP:X-Forwarded-Proto} !https
  7. RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  8. RewriteRule ^(robots\.txt)$ robots.php [L]
  9. RewriteRule ^(sitemap\.xml)$ sitemap.xml.php [L]
  10. RewriteRule ^(sitemap-obj\.xml)$ sitemap-obj.xml.php [L]
  11. RewriteRule ^(yandex\.xml)$ yandex.xml.php [L]
  12. RewriteRule ^(yandex-all\.xml)$ yandex.xml.all.php [L]
  13. RewriteRule ^(yml\.xml)$ yml.all.php [L]
  14. RewriteRule ^(yml-fat\.xml)$ yml.fat.php [L]
  15. RewriteRule ^(avito\.xml)$ avito.php [L]
  16. RewriteRule ^(avito\.jpg)$ avito-jpg.php [L]
  17. RewriteCond %{SCRIPT_FILENAME} !-f
  18. RewriteCond %{SCRIPT_FILENAME} !-d
  19. RewriteRule ^(.*) index.php?do=/$1

вся система самописная

но почему то игнорируется правила установки ответа header(«HTTP/1.0 404 Not found»);

подскажите пожалуйста в чем может быть причина?

 

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

Код (Text):
  1. <?php header(‘HTTP/1.0 404 Not Found’);

проверил результат, усложнил бы до

Код (Text):
  1. <?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:
  1. header(‘HTTP/1.1 404 Not Found’, true, 404);

всё равно бы не отработал, ну и у нормальных людей ворнинг бы высыпал )

 

так он и не отработал. тема об этом )))
— Добавлено —
только когда автор переписал всё начисто, неведомый вывод-по-неосторожности был ликвидирован и всё починилось.
— Добавлено —
или ты понял моё сообщение как «оставить всё на месте, а переписать только header()» ???
каждый раз удивляюсь как люди по разному читают один и тот же текст )))

 

автор упомянул только

PHP:
  1. header(‘HTTP/1.1 404 Not Found’, true, 404);

, я плясал от этого ;)

 

боюсь уже продолжать эту тему ))) но исходная конструкция
header($_SERVER[«SERVER_PROTOCOL»].» 404 Not Found»);
рабочая. она прямо из документации по header. причина была где-то вне её.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *