jkm

Рейтинг
120
Регистрация
20.02.2014
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]

RewriteRule "^(.+?/)start http" /$1? [R=301,L]
kapec-master #:

Здраствуйте.

В логах вылезли страницы  с 404 ошибкой такого вида:

https: //site.ru/statiay/smarta_sumka _ belaya/www.tns-counter.ru/V13a****ar_ru/ru/UTF-8/tmsec=1021689_771724-3854277/7995618670995888828

https: //site.ru/statiay/ruchka_dilun _ fertyyne/www.tns-counter.ru/V13a****ar_ru/ru/UTF-8/tmsec=1021689_771724-3854277/6524891211361101840

https: //site.ru/statiay/depesha_dedilun _ yug/www.tns-counter.ru/V13a****ar_ru/ru/UTF-8/tmsec=1021689_771724-3854277/6743298988707820364


Подскажите, как сделать  301 редирект  (.htaccess) чтобы страницы  с 404 ошибкой перенаправлялись на оригинальные страницы без   www.tns-counter.ru/V13a****ar_ru/ru/UTF-8/tmsec=1021689_771724-3854277/7995618670995888828   :

https: //site.ru/statiay/smarta_sumka _ belaya/

https: //site.ru/statiay/ruchka_dilun _ fertyyne/

https: //site.ru/statiay/depesha_dedilun _ yug/

RewriteRule ^(.+/)www\.tns-counter\.ru /$1 [R=301,L]
Чтобы не две регулярки, а одной можно с помощью (?=...) заглянуть вперёд.
<a(?=[^>]*\sid="download")(?=[^>]*\shref="([^"]*)")

https://regex101.com/r/hXMzLh/1


Ещё вариант.

<a(?:\shref="([^"]*)"|\sid="download"()|[^>])++\2
https://regex101.com/r/hXMzLh/2
Xubart #:
 А реально не запрет, а редирект на другой сайт для них как то сделать? 

При срабатывании "Deny From" клиент получает ошибку 403.
Свою страницу ошибки можно указать с помощью ErrorDocument.

Note that when you specify an ErrorDocument that points to a remote URL (ie. anything with a method such as http in front of it), Apache HTTP Server will send a redirect to the client to tell it where to find the document, even if the document ends up being on the same server. This has several implications, the most important being that the client will not receive the original error status code, but instead will receive a redirect status code.


Т.е. если указать адрес с http:// или https://, то клиент получит не 403, а редирект 302.

ErrorDocument 403 http://domain/page
Sdrozdov :

такая конструкция:

Redirect 301 /stanki$ https://site.ru/stanki.php 

не срабатывает

С регулярками работает RedirectMatch

RedirectMatch 301 ^/stanki$ https://site.ru/stanki.php
webledi #:

Спасибо, в обоих случаях редиректит на /cat/29?cat_id=29

Значит где-то есть правило, которое добавляет этот "?cat_id=".

RewriteRule ^(cat/\d+)/  /$1 [R=301,L]

Это правило нужно поставить в начало файла .htaccess чтобы оно срабатывало раньше правила добавляющего "?cat_id=".

Перед проверкой не забыть сбросить кеш браузера.

Всего: 743