использование header () на htaccess для 404 не найдено - PullRequest
0 голосов
/ 11 сентября 2011

Некоторые из веб-страниц фактически содержатся в моей базе данных. У меня есть htaccess со следующим

ErrorDocument 404 /error404.php

Моя ошибка404 сделать require("checkdb.php"); которая проверяет, представлено ли имя файла в базе данных MySQL. Если так, я хочу вернуть 200 OK и выплюнуть содержимое. Если нет, то хочу выплюнуть, что 404

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

Я добавил

header('HTTP/1.1 200 OK'); 

сразу после проверки в базе данных (код html еще не отображался), но я получаю

Внимание. Невозможно изменить информацию заголовка - заголовки уже отправлены ....

Даже если я переместу это header() в самом начале /error404.php, я все равно получу эту ошибку. Похоже, Apache сначала вернет эти 404, а затем позвонит /error404.php

Что я могу сделать, чтобы исправить это? Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Когда Apache отправляет документ, указанный в ErrorDocument, он не обслуживает его как обычную страницу и уже отправил 404 заголовка.Вместо того, чтобы использовать директиву ErrorDocument в Apache, вы должны вместо этого использовать ваш PHP-скрипт, чтобы сначала проверить, существует ли документ, и если он есть, отобразить его.Если он не существует, то PHP отправляет сам заголовок ошибки 404.

Следующее происходит не в error404.php, а в обычном сценарии, таком как index.php:

// Do whatever you're doing to check
require("checkdb.php");

// If the check fails, PHP sends the 404:
header("HTTP/1.0 404 Not Found");
// Then display your custom error document with PHP
// You can display the other contents of error404.php
echo "Oops, page wasn't found!";
exit();

И удалите директиву ErrorDocument из конфигурации Apache.

0 голосов
/ 11 сентября 2011

Строка заголовка должна быть перед любым выводом. Без некоторого кода мы не сможем указать, откуда поступает вывод.

...