Конструкция <IfModule проверяет наличие определённого модуля.Такие проверки делают чтоб не упал весь сайт если вдруг нет mod_rewrite.Когда не загружен mod_rewrite, то Apache ничего не знает о RewriteEngine, RewriteRule и прочих директивах mod_rewrite.Если в .htaccess Apache встретит что-то незнакомое (допущена опечатка или не загружен модуль) будет синтаксическая ошибка.В итоге вместо сайта ошибка 500. Конструкция <IfModule mod_rewrite.c> проверит наличие mod_rewrite и если его нет, то всё содержимое секции <IfModule </IfModule> будет проигнорировано и не вызовет ошибку синтаксиса.
<IfModule mod_rewrite.c>RewriteEngine OnRedirectMatch 410 /ru/.*</IfModule>
Тут получается проверяем наличие mod_rewrite, а директиву используем от совсем другого модуля mod_alias.Если нет mod_alias, а mod_rewrite есть, то будет ошибка синтаксиса.Видимо в плагине не стали заморачиваться дополнительными проверками потому что обычно mod_alias есть и маловероятно чтобы mod_rewrite был доступен а mod_alias нет.Так что ничего критичного тут нет.Просто перед использованием RedirectMatch логичнее проверять наличие mod_alias <IfModule mod_alias.c>
Вот от Yoast Seo редирект, работает, потому что недавно ставил на 2 сайтах. В htaccess вставьте
<IfModule mod_rewrite.c> RewriteEngine On RedirectMatch 410 /en/.* </IfModule>
А зачем в <IfModule mod_rewrite.c> запихивать RedirectMatch?RewriteEngine это директива mod_rewrite.RedirectMatch это директива mod_alias.
Логичнее
<IfModule mod_alias.c>RedirectMatch 410 ^/en/</IfModule>
Например, скачать файл с помощью curl.
curl -o bot.ico -A 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)' https://99zvuk.com/favicon.ico curl -o main.ico -A 'Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0' https://99zvuk.com/favicon.ico
Срабатыванию вашего RewriteRule могут мешать другие правила поэтому своё правило нужно ставить в начало файла .htaccess чтобы оно сработало раньше остальных правил.
Ещё там может быть Nginx самостоятельно раздаёт файлы .ico и не проксирует такие запросы на Apache так что никакие правила из .htaccess работать не будут.
Подскажите, пожалуйста, как через .htaccess сделать редирект.
Яндекс стал дописывать в урл сайтов, когда переходишь в поиске, например ?ysclid=lx34aaez17299711936
У меня стоит редирект с одной страницы, на другую, но если дописать, то 301 уже не срабатывает. И получается, если перейти из поиска, то открывается старая страница с ?ysclid=lx34aaez17299711936, если убрать это, то 301 на новую происходит.
Сайт на wp, пользуюсь плагином Redirection, сейчас хочу попробовать через htaccess сделать.
А какие настройки ставили в плагине Redirection?
Там есть настройка игнорировать все GET-параметры.
Query Parameters -> Ignore all parameters.
https://redirection.me/support/matching-a-url/
Подскажите, как сделать 301 редирект (.htaccess) чтобы страницы: /x , /f и дт. перенаправлялись на оригинальные страницы :
https: //site.ru/blue-smarta-sumka/b >> https: //site.ru/blue-smarta-sumka/
https: //site.ru/xrom-ruchka-dilun/x >> https: //site.ru/xrom-ruchka-dilun/
https: //site.ru/rich-kupon/r >> https: //site.ru/rich-kupon/
https: //site.ru/rich-kupon/b >> https: //site.ru/rich-kupon/
https: //site.ru/rich-kupon/x >> https: //site.ru/rich-kupon/
RewriteRule ^([^/]+/)[a-z]$ /$1 [R=301,L]
испортило файл <book-title>ðÏÚÄÎÅÅ ÒÁÓËÁÑÎÉÅ</book-title>
Похоже исходный файл был в KOI8-R и при попытке сконвертировать в UTF-8 получилось ðÏÚÄÎÅÅ ÒÁÓËÁÑÎÉÅ
https://onlinephp.io/c/75957
Вот например deny from IP из верхнего .htaccess работает и так
Работает ровно до тех пор, пока где-то ниже уровнем не встретися другой набор правил deny/allow.Как только в /www/site1/.htaccess будут свои правила deny/allow, то набор правил deny/allow из /www/.htaccess перестанет работать.С mod_rewrite всё аналогично.В /www/site1/.htaccess уже есть какие-то RewriteRule для вашей CMS, так что из /www/.htaccess правила RewriteRule работать не будут.Добавление RewriteOptions в /www/.htaccess будет влиять на все дочерние папки.Например:/www/.htaccess/www/site1/.htaccess/www/site1/folder/.htaccessВо всех есть свои RewriteRule. Если был запрос к /folder/, то будут объединены правила из всех трёх файлов.Правила в /www/site1/.htaccess и /www/site1/folder/.htaccess могут быть не расчитаны на такую совместную работу и возможен конфликт правил.
Так вот, почему-то это правило (например то которое подсказали вначале) в общем файле не срабатывает, а если записать конкретно в .htaccess сайта, то работает.
Дмитрий :
Редирект со всех страниц отрабатывает, НО почему то редиректит и robots.txt с /sitemap_index.xml , которые по идее не дожны редиректится так как прописаны в RewriteCond
Как на самом деле работает mod_rewrite.
Изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
RewriteRule . /index.php [L]
Это правило изменит запрос /robots.txt на /index.php и обработка начнётся заново.В %{REQUEST_URI} будет /index.php и теперь сработает правило:RewriteCond %{REQUEST_URI} !^/($|wp-admin|wp-login\.php|robots\.txt)RewriteRule ^(.*)$ https://site.com/ [R=301,L]Достаточно добавить проверку переменной %{ENV:REDIRECT_STATUS}. Там сохраняется статус предыдущего перенаправления и при первом проходе там пусто.
RewriteCond %{ENV:REDIRECT_STATUS} ^$RewriteCond %{REQUEST_URI} !^/($|wp-admin|wp-login\.php|robots\.txt|sitemap(|_index)\.xml)RewriteRule ^(.*)$ https://site.com/ [R=301,L]
Ещё вариант вместо %{REQUEST_URI} использовать %{THE_REQUEST}. Её содержимое не меняется при перенаправлении.
Там строка HTTP-запроса "GET /path?query HTTP/1.1".
RewriteCond %{THE_REQUEST} "!^\S+ /([? ]|wp-admin|wp-login\.php|robots\.txt|sitemap(|_index)\.xml)"RewriteRule ^(.*)$ https://site.com/ [R=301,L]
RewriteEngine OnRewriteCond %{REMOTE_ADDR} =11.22.33.44RewriteRule ^a/b/c/$ - [R=404,L]