Как указать Apache игнорировать / блокировать ошибку 404 и перенаправлять на страницу обработки?
Концепция
Итак, я уже сделал (фактически обновил) этот сайт с собственной системой управления контентом (CMS), которая всем нравится. Как и в большинстве CMS, поведение по умолчанию - это страницы доступа с уродливым и совершенно бесполезным URL-адресом, например:
www.mysite.edu/index.php?pageid=xxxx
Итак, идея заключалась в том, чтобы изменить его так, чтобы у нас были «настоящие» URL-адреса, которые не только выглядели бы лучше, но и, надеюсь, лучше взаимодействовали бы с поисковой системой Google. На самом деле изменение было не таким уж сложным:
- Убедитесь, что не было страницы с соответствующим URL-адресом через Apache и перенаправьте на /redirect.php с помощью ErrorDocument 404 /redirect.php
- redirect.php удаляет URL-адрес и находит его запись в базе данных.
- redirect.php отображает данные HTML из записи страницы.
Поскольку все страницы были созданы в иерархической структуре (в соответствии с CMS), поиск страницы сводился к простому поиску дочерней страницы базы данных до тех пор, пока не будет найдена последняя. Таким образом, URL-адрес, такой как, www.mysite.edu/me/something/useful
будет вызывать запись, useful
дочерним элементом something
которой является me
. Весь HTML-код страницы хранится в базе данных, поэтому, как только запись будет найдена, ее несложно отобразить на странице через PHP.
Боковое примечание: я фактически создал новую таблицу, в которой хранится полный URL-адрес каждой страницы и связывается с ней, pageid
поэтому процесс поиска значительно улучшен, в то время как общая идея остается прежней.
Эта проблема
На стороне клиента все отлично работает. Однако я заметил, что Google еще не проиндексировал большую часть нашего сайта. По сути, он был в некоторой степени проиндексирован до того, как я переделал его, и теперь от индекса остались только файлы, URL-адреса которых остались прежними.
Я наконец (сегодня) получил некоторые данные из Google Webmaster Tools, которые говорят, что он продолжает получать 404 ошибки на страницах, перечисленных в нашем sitemap.xml, но когда я нажимаю на ссылки, страницы появляются нормально. Это заставляет меня думать, что, хотя перенаправление работает хорошо, Apache все еще отправляет Status: 404
сообщение, которое, вероятно, побуждает роботов Google прекратить обработку и / или не индексировать страницу.
Вопрос
Итак, имея в виду все это, вопрос заключается в следующем:
- Есть ли способ сначала подтвердить, что Apache все еще отправляет
Status: 404
сообщения?- Ответ: да!
- Есть ли способ остановить его при перенаправлении на /redirect.php
Заранее спасибо!
Изменить 1: Спасибо, Алекс, за то, что познакомил меня с вкладкой Net в 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();
}
?>
Ответов (2)2
Вы можете использовать Firebug, чтобы узнать, отправляет ли он заголовки 404. Используйте вкладку net . Если это 404, GET для страницы будет красным. В качестве альтернативы вы можете использовать заголовки Live HTTP. Это только для Firefox.
Можете ли вы опубликовать некоторые из ваших .htaccess, которые перенаправляют на redirect.php?