Как сделать, чтоб код возврата ErrorDocument был 301?

mastrelelik

Новичок
в .htaccess есть строка:
ErrorDocument 404 /404.html

Сейчас если страница не найдена код возврата = 302 (т.е. страница перемещена временно).
Как заставить ErrorDocument возвращать код=301 (страница перемещена постоянно) или иным способом перемещать на страницу 404.html с кодом 301?

Это необходимо для сео, для гугл-ботов.
 

WMix

герр M:)ller
Партнер клуба
а ты уверен что это апачь отвечает может это
PHP:
header( 'location  ...');
покажи весь .htaccess
 

mastrelelik

Новичок
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.php$ /ru/$1.php [L]

RewriteRule ^(.*).html$ /$1.php [L]

ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
 

WMix

герр M:)ller
Партнер клуба
а может быть такое что у тебя лежит файл 404.php?
какой запрос дает неправильный код ошибки?
 

WMix

герр M:)ller
Партнер клуба
я еще больше запутался.
я понимаю что у тебя написанно.

но так вроде уже не правильно
Код:
RewriteRule ^(.*)\.php$ /ru/$1.php [L]
RewriteRule ^(.*).html$ /$1.php [L]
тут ты утверждаешь что 404.html лежит в корне
Код:
ErrorDocument 404 /404.html
а тут в папке /ru/
Сам файл конечно же есть и лежит по адресу
http://site.ru/ru/404.php
попробуй в файле 404.php в самом начале написать exit; и убедится что это он вызывается и что код ответа 404
 

mastrelelik

Новичок
"лежит в корне" вроде не говорил.
404.php вызывается точно, и код дает правильный - 404. Но какого-то рожна перед тем как получаем код возврата 404 сначала получаем код 302.

Вот дословно:

HTTP/1.1 302 Found
Date: Thu, 28 Mar 2013 20:05:02 GMT
Server: Apache/2.2.22 (FreeBSD) PHP/5.3.11 with Suhosin-Patch mod_ssl/2.2.22 OpenSSL/1.0.1a DAV/2
Location: http://site.ru/404.html
Connection: close
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 404 Not Found
Date: Thu, 28 Mar 2013 20:05:02 GMT
Server: Apache/2.2.22 (FreeBSD) PHP/5.3.11 with Suhosin-Patch mod_ssl/2.2.22 OpenSSL/1.0.1a DAV/2
X-Powered-By: PHP/5.3.11
Set-Cookie: PHPSESSID=10bd8686054d0d259ee22a4b57ec72fb; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
 

mastrelelik

Новичок
Да, тут идет переадресация на файл, который должен находиться в корне.
И когда ищется этот файл, то две другие строки подсказывают, что используется mod_rewrite и на самом деле файл лежит в папке "ru".
RewriteRule ^(.*)\.php$ /ru/$1.php [L]
RewriteRule ^(.*).html$ /$1.php [L]

Для оптимизации заменил последнюю из двух на
RewriteRule ^(.*).html$ /ru/$1.php [L]
 

hell0w0rd

Продвинутый новичок
А вот тут, чем плох, если не используется фреймворк, вариант с функцией вида:
PHP:
error_page($code){
    header('', true, $code);
    render('errors/'.$code.'.php');
    exit();
}
Просто на сколько я понимаю у вас все идет через index.php, а значит 404 отдаете сами. В таком случае нет никакой переадресации(я могу быть не прав), а вы просто отдаете заголовок клиенту, мол 404, или другая, ошибка.
 
Сверху