Сегодня хочу поднять тему создания 404 ошибки средствами apache через файл .htaccess . Я уже расказывал вам о том, как можно создать ошибку 404 на php, а так же о том как сделать 301 редирект на htacces, - пришло время рассказать о htaccess 404 ошибка. В этом уроке попробуем сделать htaccess 404 redirect таким образом, чтоб ошибка 404 была видна сразу, без 301 и 302 редиректа и без использования PHP, чтоб не нагружать его.
Коненчо эта тема мусолилась в сети не один раз и не один блогер расказывал о такой функции файла конфигурации веб сервера апаче. Я хочу описать сам механизм ответа ошибки 404 для любой страницы, точнее для определенного url или для их группы.Это не опечатка, действительно ошибка 404 создается аналогично 301 редиректу в .htaccess но с некой оговоркой.
Предположим, что у нас на сайте есть ненужные ссылки с GET параметрами, например ваш_сайт/?more=1 и мы хотим запретить их показывать отдав ошибку 404 в ответ.
RewriteCond %{QUERY_STRING} ^.*more=1.*
RewriteRule . - [R=404,L,NC]
Забрасываем этот код в файл htaccess в корне вашего сайта WordPress и смотрим результат:
Вот так вот, браузер получает ошибку 404 через redirect. Аналогичное сообщение получит и поисковый бот и через время выбросит этот url из своего кеша.
Если вам нужно заблокировать какую нибудь страницу WordPRess, например ваш_сайт/privet-mir/, можно написать код вот такого плана:
RewriteCond %{REQUEST_URI} ^/privet-mir.*
RewriteRule . - [R=404,L,NC]
Результат работы предсказуемый:
Я тестировал этот результат только на CMS WordPress, если у вас не получается использовать 404 редирект htaccess на другой системе управления не стоить расстраиваться, по всей видимости код для них может быть похожий. Как альтернатива попробуйте вот такой код:
RewriteCond %{REQUEST_URI} ^/indent/.*
RewriteRule ^(.*)$ [R=404]
Он не работает на вордпресс, но работает на сайтах без системы управления контентом.
Если вы внимательно тестировали результат работы, то наверное заметили вот эту дурацкую ошибку:
Для того, чтоб указать какая страница отвечает за обработку 404 ошибки мы можем написать вот такой код перед вызовом нашей ошибки:
ErrorDocument 404 http://vash_sayt/404/
Полный код будет выглядеть приблизительно вот так тогда:
ErrorDocument 404 http://vash_sayt/404/
RewriteCond %{REQUEST_URI} ^/privet-mir.*
RewriteRule . - [R=404,L,NC]
И тут как говорится за что боролись, на то и напоролись:
Перед ошибкой 404 мы получаем ошибку 302 и это как говорят СЕО шники очень плохо. В общем если ваш заказчик не СЕО специалист этот вариант прокатит, в альтернативном варианте надо использовать PHP для генерации ответа. Об этом я писал вот здесь: 404 c php
Если мне удастся решить проблему с htaccess 404 redirect 302 я обязательно напишу вам об этом в этой же теме. На данный момент решение проблемы не найдено. Решение есть, описал его ниже.
Аналогично можно было не придумывать каруселей и сделать 404 редирект на htaccess через 301 редирект, разницы по сути никакой, только проще и быстрее:
RewriteCond %{REQUEST_URI} ^/privet-mir.*
RewriteRule ^(.*)$ http://%{HTTP_HOST}/404/? [R=301,L]
По сути задача сделать саму ошибку 404 превратилась в банальное перенаправление на 404. Будем искать варианты.
Возможно мой код покажется вам громоздким, но единственный способ, который я смог придумать для того, что удалить 302 редирект перед ошибкой 404 - и выглядит это дело вот так:
ErrorDocument 404 /error.html
RewriteCond %{REQUEST_URI} ^/privet-mir.*
RewriteRule . - [R=404,L,NC]
В корне сайта создаем файл "error.html" и туда забрасываем хтмл код, который генерирует ваш сервер WordPress. Вот результаты работы:
и вот же правильная страница ошибки без редиректа 302:
Теоретически на этом все. Теперь вы знаете как делается ошибка 404 на htaccess.
Если вы имеете другие решения htaccess 404 redirect или перенаправление на 404 без редиректа 301 и 302 буду рад вас выслушать. Обращайтесь, пишите комментарии, жмите лайк.
Помогите справиться с проблемой. Есть сайт, который сейчас работает на wp, до этого работал или на джумле или на opencart. Остались хвосты в виде url сайт/?route=product/category&path=44
требуется все эти хвосты перевести в 404.
Пробовал добавить в .htaccess такой код:
RewriteCond %{QUERY_STRING} ^.*route.*
RewriteRule . - [R=404,L,NC]
но это не помогает, все равно 200 ОК отдает.
писал вот такой код полностью.
RewriteCond %{QUERY_STRING} ^.*route.*
RewriteRule . - [R=404,L,NC]
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
и не хочет гад.
Не сочтите за наглость, приведу конкретный пример.
(-url-)
вот этой странице нужно прописать 404.
ПРивет очень круто искал долго решения. Но почему то оно мне не помогло идет все равно редирект на главную. Ситуация следующая сайт спамят беками на страницы моего сайта - site.ru/?page=(-url-) (все время разные сайты). Использовал код # BEGIN WordPress
RewriteCond %{QUERY_STRING} ^.*page=.*
RewriteRule . - [R=404,L,NC]
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
# END WordPress
Но при переходе на страницу site.ru/?page=(-url-) почему то переход идет на мою главную страницу. Подскажите может чтото сделать или кто-то знает. Спасибо.
Сделал так:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
ErrorDocument 404 /error.html
RewriteCond %{QUERY_STRING} ^.*page=.*
RewriteRule . - [R=404,L,NC]
RewriteRule . /index.php [L]
Не работает)
Поставил 301
Redirect 301 /?page=http://(-url-) (-url-)
Также все равно на главную.
Здравствуйте.. понравилась статья..но у меня другой вопрос. Блог на ВП, а как сделать чтобы переводило на ошибку 404 со страниц с регистром HTTPS ..Просто у меня не получилось из-за сложности шаблона перейти на этот регистр но Яндекс уже успел проиндексировать и склеить зеркала, и теперь пользователи переходя по ссылке с поисковика натыкаются на фразу "Соединение не защищено" и т.п. а так хотя бы на блог с предложением других статей попадали (у меня так настроена при ошибке 404) ..Спасибо за ответ.
SOS
Не могу победить
.htaccess
php_flag register_globals on
RewriteEngine on
RewriteRule ^([-,0-9,a-z]+)$ /index.php?area=1&p=static&page=$1
Стандартное сообщение с перенаправлением на главную
Создал new404 (-url-)
Если вместо $1 вставляю new404, то все ссылки идут только на неё.
Помогите, пожалуйста, задействовать при ошибке 404 перенаправление на new404 и убрать стандартное сообщение.
index.php?area=1&p=static&page=new404
Поставил, но на него реагируют только ссылки с любым или несуществующем расширением.
У меня страницы без расширения вызываются.
У меня Koobi.
Мне нужно перенаправление на (-url-)
ErrorDocument 404 /index.php?area=1&p=static&page=new404
Оказывается, что проблема состоит не в том, чтобы корректно настроить правила в конфигурационном файле .htaccess , а в том, что при запросе несуществующих страниц на сайте вместо 404 кода отдается 200
У меня страницы tpl.
При вставке ПХП получается
Здравствуйте!
Выше Вы показали пример, как отдать ошибку 404 странице с урлом типа "/?more=1"
А подскажите пожалуйста, что нужно прописать в .htaccess, чтобы ошибка 404 присваивалась не только "/?more=1", а всем страницам, содержащим в себе идентификатор "/?more=".
То есть, и "/?more=1", и "/?more=2", и "/?more=3" и так далее...
Заранее спасибо.
Будьте добры, как сделать, чтобы вместо главной страницы при любом ошибочном урл был код 404. Я понимаю, что в Hhtaccess надо прописывать конкретную страницу? А что делать в моем случае?
Не знаю с какого источника вы нашли этот пример, но он реально работает. Получается чистая ошибка 404 на htaccess без редиректов и ошибок 302. Большое вам спасибо.
Да вы я смотрю прям извращенец. Всякое встречал, но чтоб через такую за....цу делать ошибку 404 еще не видал.
Не проще из пхп послать код 404 ???
1) У меня нет .htaccess
2) Как сделать так, чтобы при переходе на не известную ссылку сайта, допустим: (-url-) - выдавала страница 404.html. У меня открывается, но только с такого: (-url-). А я хочу чтобы выдавала на всех длинных неизвестных стр. как допустим: (-url-)... -Понимаете?
Что можно в код добавить? (Пробовал добавить такие как в конце: ... -не пойдет.)
1) .htaccess с панели сервера не создается, точнее создается, но она сразу исчезает. (создаю новый файл > переименовываю > сохраняю, а она выдает ошибку) - ОК.
2) Созданный файл с компа на NotePade++ - .htaccess при переносе на Cpanel > Pablic... - Тут же исчезает, искал во всех папках, и не нашел.
3) Создал 404.html по другой схеме, но она работает только при переходе в неизвестную стр.сайта к примеру: 111.ru/sddfg - Здесь выдаст 404 файл, но если написать 111.ru/sddfg/fgb - то 404 файл не появляется. Пытался итак и так, но без результатно.
Не плохое решение, автору респект. Сам хотел придумать и заставить WordPress правильно отдавать 404 ошибки на htaccess но чет не получалось. Собственно мудрил как и вы но не придумал что делать с 302 ошибой. По сути я вместо 404 получал 302 и это очень плохо, вам подтвердит любой нормальный сеошник. Это все равно что сделать запрет на директорию, она как бы есть но поисковики ругаются, хотя страницу можно закрыть и так :))))))
На пхп ошибка 404 делается намного проще. Зачем тогда выдумывать велосипед и делать ошибки 404 на htaccess ?? Какая в этом логика. С точки зрения СЕО 404 ошибка она и в африке 404, как не крути. Ведь так?
а у меня вроде работает такой редирект:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ - [L,R=404]
ErrorDocument 404 /404.shtml
Но почему то тольок для главной страницы. На другизх страницах, после такой вставки почему-то портится дизайн сайта, т.е изображение и другие кажись стили слетают. Почему так? На главной странице вроде всё ок.