header('Status: 404 Not Found'), RewriteCond, ErrorDocument не могу разобраться

gv0zd

Новичок
Есть рабочий сайт с рабочим ЧПУ
PHP:
//Содержание .htaccess
RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^([^.]*)$ /index.php?rewrite_path=$1 [QSA] //В ЧПУ могут быть любые символы кроме точек
PHP:
//Содержание index.php

//Проверка входящего ЧПУ
...
...
if ($page) {
    //Выдаем запрошенный контент
}
else {
    header ('Location: /');
    exit;
}
Т.е. если скрипт не находит никакого соответствия, просто отправляем на главную страницу.

Решил я, что это неправильно. Лучше выдавать в таком случае 404 заголовок. Сделать специальную страницу для 404 ошибки. И на эту страницу перенаправлять через .htaccess

PHP:
//Содержание .htaccess
ErrorDocument 404 /error

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^([^.]*)$ /index.php?rewrite_path=$1 [QSA] //В ЧПУ могут быть любые символы кроме точек
PHP:
//Содержание index.php

//Проверка входящего ЧПУ
...
...
if ($page) {
    ///Что-то делаем
}
else {
    header('Status: 404 Not Found');
    exit;
}
Что получается в данном случае:
Если я запрашиваю http://site.com/aaa.bbb, сервер выдает 404 ошибку и меня успешно перенаправляет на http://site.com/error

Если же я запрашиваю http://site.com/aaa/bbb, php скрипт отрабатывает как нужно
т.е. заходит сюда
PHP:
else {
    header('Status: 404 Not Found');
    exit;
}
Но 404 ответа от сервера я не получаю.
Если делаю так
PHP:
else {
    //header('Status: 404 Not Found');
    echo 'Ошибка';
    exit;
}
Вижу надпись Ошибка.
Если переписываю RewriteCond
PHP:
//Содержание .htaccess
ErrorDocument 404 /error

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php?rewrite_path=$1 [QSA] //В ЧПУ могут быть точки
PHP:
//Содержание index.php

//Проверка входящего ЧПУ
...
...
if ($page) {
    ///Что-то делаем
}
else {
    header('Status: 404 Not Found');
    exit;
}
Т.е. разрешаю, чтоб в ЧПУ были точки, то уже и http://site.com/aaa.bbb не пересылается на страницу http://site.com/error.

Т.е. я так понимаю, траблы в .htaccess
Подскажите, Как сделать. чтоб и ЧПУ работали и 404 еррор кошерно обрабатывался.
Заранее спасибо
 

radioheaded

PHP нуб
PHP:
header('HTTP/1.0 404 Not Found');
Где-то видел решение на все случаи жизни, это было что-то вроде

PHP:
header('HTTP/1.0 404 Not Found');
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
 

gv0zd

Новичок
Спасибо.
Теперь есть 404 ответ от сервера (смотрю firebug'ом)
Но только почему-то .htaccess все равно не перенаправляет куда нужно...
В чем проблема, подскажите, проверяю и на локальном компе и на хостинге
 

radioheaded

PHP нуб
Но только почему-то .htaccess все равно не перенаправляет куда нужно...
А он должен? Откуда он узнает, какие заголовки вы отправили браузеру? .htaccess работает на фронтэнде, обрабатывается входящий запрос, если там правила не сработали, то тогда да, 404. А если все сработало, сработал редирект, то работа успешно завершена. Создайте функцию или метод в классе, который будет перенаправлять на указанную страницу, которая в свою очередь будет возвращать 404. Посмотрите как это сделано в популярных фреймворках, если не получится.
 

gv0zd

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