Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вернуть 404 при редиректе


Автор: AXS 27.6.2010, 12:21
Доброго времени, форумчане! )
Помогите разобраться в следующей ситуации:
----------------------------------------------------------------------
У меня организован следующий алгоритм отображения несуществующих страниц:

В файле .htaccess
Код

ErrorDocument 401 /show/error/401/
ErrorDocument 403 /show/error/403/
ErrorDocument 404 /show/error/404/
php_flag register_globals Off
Options -Indexes 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule mod/(.*)$ index.php?mod=$1
RewriteRule action/(.*)$ index.php?action=$1
RewriteRule show/(.*)$ index.php?show=$1 [L]


При действительно не существующих страницах - всё ок. 
Но вот в чём загвоздка - движок организован так:
Первый параметр ссылки (mod|action|show) определяет что будем делать - активировать модуль, совершать какое либо действие или просто показывать материал. Дальше зависит от последующих параметров, например, если это show, то анализируется параметр $GET['page']
Код

switch($GET['page']) {
  case 'article':
    include './modules/article_router.php';
  break;

  case 'error':
    include './modules/error_router.php';
  break;

  case 'user':
    include './modules/user_router.php';
  break;
}


Ну вот так грубо говоря. Но если параметр $GET['page'] неизвестен движку надо бы показать 404 юзеру... А тут ничего не происходит...
Добавил дефолт:
Код

  default:
    header('HTTP/1.1 404 Not Found');
    header('location: '.DVG_HOST.'show/error/404');
  break;

Кстати в модуле error_router.php 404 заголовок тоже на этот случай вызывается.
И вот вылезла проблема: при редиректе пофиг какой заголовок ты отправил, если это не 30х статус, то редирект передаст свой статус 302.

Так то всё ок, но для поисковиков это плохо - обратившись к странице http://mysite.ru/show/fignya/bla/bla он получит сначала 302 (страница временно перемещена), а следом 404 (не существует). А это не есть хорошо.

Как побороть сей баг? Чтобы формально не существующие страницы возвращали 404?

Автор: AXS 27.6.2010, 14:25
Что то туплю я вроде... smile

Код

  default:
    $GET['mode'] = '404';
    include './modules/error_router.php';
    include './modules/main_router.php'; 
  break;


В error_router.php вызывается header('HTTP/1.1 404 Not Found') и прочие советы юзеру и все рады...
И чё я в этот редирект упёрся?... ###...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)