Как сказать Apache игнорировать/блокировать ошибку 404 и перенаправить на страницу обработчика?

Концепция

Итак, я уже сделал (фактически обновил) этот сайт с собственной системой управления контентом (CMS), которая всем нравится. Как и в большинстве CMS, поведением по умолчанию были страницы доступа с уродливыми и совершенно бесполезными URL-адресами, такими как:

www.mysite.edu/index.php?pageid=xxxx

Идея заключалась в том, чтобы изменить его так, чтобы у нас были «настоящие» URL-адреса, которые не только выглядели бы лучше, но и лучше взаимодействовали бы с поисковой системой Google. Изменение действительно было не таким уж сложным:

  1. Увидеть, что не было страницы с соответствующим URL через Apache и перенаправить на /redirect.php с помощью ErrorDocument 404 /redirect.php
  2. redirect.php удаляет URL-адрес и находит его запись в базе данных.
  3. redirect.php повторяет данные HTML из записи страницы.

Поскольку все страницы были созданы в иерархической структуре (согласно CMS), поиск страницы был просто вопросом поиска в базе данных дочерних элементов, пока не был найден последний. Таким образом, URL-адрес, такой как www.mysite.edu/me/something/useful, вызовет запись в useful, которая является дочерней для something, которая является дочерней для me. Весь HTML-код страницы хранится в базе данных, поэтому, как только запись найдена, ее просто вывести на страницу через PHP.

Примечание: я фактически создал новую таблицу, в которой хранится полный URL-адрес каждой страницы и связывается с ее pageid, поэтому процесс поиска значительно улучшился, а общая идея осталась прежней.

Эта проблема

На стороне клиента все работает изумительно хорошо. Однако я заметил, что Google еще не проиндексировал большую часть нашего сайта. По сути, он был в некоторой степени проиндексирован до того, как я его реконструировал, и теперь все, что осталось от индекса, — это файлы, URL-адреса которых остались прежними.

Наконец-то (сегодня) я получил некоторые данные из Инструментов Google для веб-мастеров, которые говорят, что он продолжает получать 404 ошибки на страницах, перечисленных в нашем sitemap.xml, однако, когда я нажимаю на ссылки, страницы открываются просто отлично. Это наводит меня на мысль, что хотя перенаправление работает хорошо, Apache по-прежнему отправляет сообщение Status: 404, которое, вероятно, побуждает ботов Google прекратить обработку и/или не индексировать страницу.

Вопрос

В связи со всем этим возникает вопрос:

  1. Is there a way to first confirm that Apache is still sending Status: 404 messages?
    • Answer: yes!
  2. Есть ли способ остановить его, продолжая перенаправлять на /redirect.php

Заранее спасибо!

Редактировать 1: Спасибо, Алекс, что познакомил меня с вкладкой «Сеть» в firebug. Поскольку я люблю и часто использую firebug, я уверен, что эта новая функция пригодится позже в будущем (читай: в настоящее время исследую другие возможности, которые она может делать). Благодаря вашему сообщению я смог подтвердить, что Status: 404 действительно является той проблемой, которую необходимо решить. Теперь вопрос конкретно в том, как отключить Apache от отправки этой ошибки и просто перенаправить страницу так, как мне нужно.

По просьбе, вот несколько примеров кода из моих файлов. Одна вещь, которую следует отметить в отношении файлов конфигурации, заключается в том, что я работаю на Debian Etch и устанавливаю через «apt-get install apache2 mysql-server php5», поэтому они немного разбросаны, и фрагмент из списка — единственный, который, по моему мнению, имеет значение для Эта проблема. Поскольку это большой файл (669 строк), если вы хотите увидеть больше, пожалуйста, скажите мне, какие части будут полезны, и я включу их.

/etc/apache2/apache2.conf

...
ErrorDocument 404 /redirector.php
...

/etc/apache2/apache2.conf - пустой файл

/www-root/redirector.php

<?php
//get the URL string after server id.
//    e.g. www.mysite.edu/page returns "/page"
$pageReq = preg_replace("/\/$|\.php$|\.html?$/","",$_SERVER['REQUEST_URI']);

if(substr($pageReq,0,5)=='/wiki') {    //am I redirecting to the wiki app
    include "mewiki/wiki.php";
} else {                                //rest of site - what google will see
    if($pageReq=='')                    //most site looks like /ME/something
        $pageReq = '/ME';               //this fixes index to be appear as /ME
    include "config.php";

    //query the database for pageid
    mysql_connect($meweb['host'],$meweb['user'],$meweb['pass']);
    mysql_select_db($meweb['database2']);
    $qPageReq = mysql_query("SELECT pageid FROM url_redirects WHERE ".
                                "url='".$pageReq."'".
                                "ORDER BY updated DESC LIMIT 1");
    if($qPageReq) {
        //query database for actual page
        $pageid = mysql_fetch_assoc($qPageReq);
        $qPage = mysql_query("SELECT * FROM pages WHERE pageid=".
                                                $pageid['pageid']);
            if($qPage) {
                //createPage() is in page_loader.php.  It actually does a lot
                include "page_loader.php";
                createPage(mysql_fetch_assoc($qPage));
            }
    }
    mysql_close();
}
?>

person Mike    schedule 24.02.2009    source источник
comment
Я удалил свой ответ, так как он касался только одного из ваших вопросов, и я не хочу, чтобы другие видели, что у него есть 1 ответ.   -  person Sean Bright    schedule 25.02.2009
comment
Не беспокойтесь, вкладка net очень полезна, и я рад, что вы ее открыли! К сожалению, я вернулся сюда слишком поздно, чтобы дать следующую часть ответа.   -  person alex    schedule 03.03.2009


Ответы (2)


Вам нужно отправить заголовок OK, добавить header('HTTP/1.1 200 OK') в свой код.

person vartec    schedule 25.02.2009

Вы можете использовать Firebug, чтобы узнать, отправляет ли он заголовки 404. Используйте вкладку net. Если это 404, GET для страницы будет красным. В качестве альтернативы вы можете использовать заголовки Live HTTP. Они только для Firefox.

Можете ли вы опубликовать некоторые из ваших .htaccess, которые перенаправляют на redirect.php?

person alex    schedule 24.02.2009