jkm

Рейтинг
120
Регистрация
20.02.2014
ranking factor #:
Как я понимаю, в модуль прописано чтобы не мешать другим  mod_rewrite.c.

Конструкция <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 On
RedirectMatch 410 /ru/.*
</IfModule>

Тут получается проверяем наличие mod_rewrite, а директиву используем от совсем другого модуля mod_alias.
Если нет mod_alias, а mod_rewrite есть, то будет ошибка синтаксиса.
Видимо в плагине не стали заморачиваться дополнительными проверками потому что обычно mod_alias есть и маловероятно чтобы mod_rewrite был доступен а mod_alias нет.
Так что ничего критичного тут нет.
Просто перед использованием RedirectMatch логичнее проверять наличие mod_alias <IfModule mod_alias.c>

ranking factor #:

Вот от 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>
Ну или совсем без <IfModule </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 работать не будут.

qvaro #:

Подскажите, пожалуйста, как через .htaccess сделать редирект.

Яндекс стал дописывать в урл сайтов, когда переходишь в поиске, например ?ysclid=lx34aaez17299711936

У меня стоит редирект с одной страницы, на другую, но если дописать, то 301 уже не срабатывает. И получается, если перейти из поиска, то открывается старая страница с ?ysclid=lx34aaez17299711936, если убрать это, то 301 на новую происходит.

Сайт на wp, пользуюсь плагином Redirection, сейчас хочу попробовать через htaccess сделать.

А какие настройки ставили в плагине Redirection?

Там есть настройка игнорировать все GET-параметры.

Query Parameters -> Ignore all parameters.

https://redirection.me/support/matching-a-url/

kapec-master #:

Подскажите, как сделать  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]
lutskboy #:

испортило файл <book-title>ðÏÚÄÎÅÅ ÒÁÓËÁÑÎÉÅ</book-title>

Похоже исходный файл был в KOI8-R и при попытке сконвертировать в UTF-8 получилось ðÏÚÄÎÅÅ ÒÁÓËÁÑÎÉÅ

https://onlinephp.io/c/75957

Vitaly2012 #:

Вот например 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 могут быть не расчитаны на такую совместную работу и возможен конфликт правил.

Vitaly2012 #:

Так вот, почему-то это правило (например то которое подсказали вначале) в общем файле не срабатывает, а если записать конкретно в .htaccess  сайта, то работает.


Итак, имеем два файла:

/www/.htaccess
/www/site1/.htaccess

И оба файла содержат правила mod_rewrite.
По умолчанию будут использованы правила mod_rewrite только из /www/site1/.htaccess

Для настройки наследования и порядка объединения правил есть отдельная директива RewriteOptions

Дмитрий :

Редирект со всех страниц отрабатывает, НО почему то редиректит и  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]
Например, страница site.ru/a/b/c/ и ip клиента 11.22.33.44.
RewriteEngine On

RewriteCond %{REMOTE_ADDR} =11.22.33.44
RewriteRule ^a/b/c/$ - [R=404,L]

Всего: 749