Ru-Board.club
← Вернуться в раздел «Web-программирование»

» mod_rewrite: документация, готовые решения, вопросы

Автор: Sutar
Дата сообщения: 28.06.2015 18:52
Здравствуйте,
Есть такой кусок:


Код: RewriteRule ^test(|/(|([0-9]+)))$ bay/$1.php?t=$3 [NS,L]
RewriteRule ^bay(.*)$ .$1 [R=404,L]
Автор: Mavrikii
Дата сообщения: 28.06.2015 20:43

Цитата:
RewriteCond %{IS_SUBREQ} f
RewriteRule ^bay(.*)$ .$1 [R=404,L]
Автор: Sutar
Дата сообщения: 29.06.2015 13:04
Mavrikii
не хочет(
Автор: Mavrikii
Дата сообщения: 29.06.2015 19:22
Sutar

Цитата:
не хочет(

весь код покажите.
Автор: elektron
Дата сообщения: 24.08.2015 08:34
Как забанить Mozilla/4.0 (compatible; Synapse) ?

Вариант RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0.\(compatible\;\Synapse\) [OR] не помогает.
Автор: Mavrikii
Дата сообщения: 24.08.2015 09:22
elektron
зачем экранировать точку с запятой?
к тому же у вас пробел написан в UA после точки с запятой, а в регулярке его нет.
Автор: unreal666
Дата сообщения: 24.08.2015 10:19
и еще:
- разве ^Mozilla/4\.0.\(compatible\;\Synapse\) не надо заключать в двойные кавычки?
- [OR] разве работает в RewriteCond? Это же из RewriteRule.
Автор: Mavrikii
Дата сообщения: 24.08.2015 10:28
unreal666

Цитата:
не надо заключать в двойные кавычки?

не нужно


Цитата:
Это же из RewriteRule.

это, как раз, из условия
Автор: elektron
Дата сообщения: 24.08.2015 13:10
Как же должно быть в итоге?

Поставил RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0.\(compatible;\ Synapse\) [OR]

Посмотрю завтра, блокирует или нет.
Автор: Mavrikii
Дата сообщения: 24.08.2015 19:22
elektron
Пробел тоже не нужно экранировать
Автор: elektron
Дата сообщения: 24.08.2015 20:49
Mavrikii

Я пробовал не экранировать, ошибка 500. Сайт не работает.
Автор: Mavrikii
Дата сообщения: 24.08.2015 22:51
elektron
а, да.. не сообразил сразу - он же после пробела ищет флаг )
можно было заменить его на просто \s
Автор: elektron
Дата сообщения: 25.08.2015 10:32
Не работает блокировка. Mozilla/4.0 (compatible; Synapse) продолжают лезть.
Автор: Mavrikii
Дата сообщения: 25.08.2015 18:59
elektron
может причина не тут, а в остальных правилах? или там набор для других UA и все срабатывает?

регулярка, в принципе, правильная. проверка в онлайн тестах показывает, что срабатывает.
Автор: elektron
Дата сообщения: 25.08.2015 22:14
Mavrikii

там набор для других UA, они работают

RewriteCond %{HTTP_USER_AGENT} ^MJ12bot [OR]
RewriteCond %{HTTP_USER_AGENT} ^Exabot [OR]
RewriteCond %{HTTP_USER_AGENT} ^AhrefsBot
RewriteRule ^.* - [F,L]
Автор: Mavrikii
Дата сообщения: 25.08.2015 22:22
elektron
при копировании UA ничего не теряете? пробелы там или еще что то.
ну попробуйте так
^Mozilla/4\.0\s+\(compatible;\s+Synapse\)
Автор: elektron
Дата сообщения: 26.08.2015 14:55
Mavrikii

RewriteCond %{HTTP_USER_AGENT} ^MJ12bot [OR]
RewriteCond %{HTTP_USER_AGENT} ^Exabot [OR]
RewriteCond %{HTTP_USER_AGENT} ^AhrefsBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0\s+\(compatible;\s+Synapse\)
RewriteRule ^.* - [F,L]

Этот вариант работает. Спасибо за помощь!
Автор: FoxBlack09
Дата сообщения: 26.08.2015 16:19
Здравствуйте, уважаемые специалисты. Подскажите пожалуйста, как должно выглядеть правило блокировки по referer-у для Nginx (наверняка веб сервер не важен, но всё же я решил указать)? Мой текущий вариант:
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?buttons-for-website.com.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://*.glowsoftmobile\.ru [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://*.semalt\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?makeprosoft.ru.*$ [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.alipromo\.com [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.copi\.st [NC,OR]
RewriteCond %{HTTP_REFERER| ^https://*.iqoption\.com [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.777s\.ru [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.surfingbird\.ru [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.hitboss\.ru [NC,OR]
RewriteCond %{HTTP_REFERER| ^http://*.la2q\.ru [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?100dollars-seo\.com.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?success-seo\.com.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?videos-for-your-business\.com.*$[NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?semaltmedia\.com.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?cmle\.ru.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?cameleo\.ru.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?24open\.ru.*$ [NC]
RewriteRule ^.* - [F,L]
судя по статистике, не работает.
Автор: Mavrikii
Дата сообщения: 26.08.2015 17:43
FoxBlack09
Еще как важен сервер. У nginx вообще синтаксис конфигов другой.
Если nginx конечный сервер, а не фронтенд, то в раздел Помощь сисадмину. Ну и в онлайне есть сервисы перевода правил права в правила для nginx
Автор: FoxBlack09
Дата сообщения: 26.08.2015 18:15
Mavrikii
Да, я перепроверил одним простым правилом .htaccess-а и убедился что хостер предоставил ложную информацию: всё таки у меня апач (т.к. правило RewriteCond %{REMOTE_ADDR} сработало, да и визуально какие либо зацепки по которым можно определить апач это или nginx отсутствуют).
Автор: Mavrikii
Дата сообщения: 26.08.2015 18:55
FoxBlack09
nginx, возможно, кэширующий фронтенд.

точки экранировать нужно, если не хотите, чтобы они означали любой символ.
более того, .*$ в конце не нужно, это и так подразумевается автоматически.

Автор: FoxBlack09
Дата сообщения: 27.08.2015 10:50
И вновь смотрю статистику, с success-seo есть переходы, значит
RewriteCond %{HTTP_REFERER} ^http://*.success-seo\.com [NC,OR]
не работает.
Автор: Mavrikii
Дата сообщения: 27.08.2015 11:04
FoxBlack09
Потому, что запись вида //* говорит о том, что слеш может быть неограниченное число раз или ни разу. Точку куда съели? http://.*\.success и так далее
Автор: FoxBlack09
Дата сообщения: 27.08.2015 11:17
Mavrikii
Спасибо, исправил.
Автор: memo
Дата сообщения: 15.09.2015 08:04
Вопрос как-бы простой...

Нужно сделать такое перенаправление:

1 www.site1.com/dir --> http://site2.com/dir

2. site1.com/dir --> http://site2.lt/dir

cPanel генератор создаёт такой скрипик:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.site1\.com$
RewriteRule ^dir\/?$ "http\:\/\/site2\.com\/dir" [R=301,L]


Вроде всё правильно, но переадресация не работает:

http://www.site1.com/dir/modules/sections/index.php?op=viewarticle&artid=40
http://www.site1.com/dir/modules/sections/index.php?op=viewarticle&artid=39
http://www.site1.com/dir/modules/sections/index.php?op=viewarticle&artid=37
...и т.д.

Нет перенаправления на:

http://site2.com/dir/modules/sections/index.php?op=viewarticle&artid=40
http://site2.com/dir/modules/sections/index.php?op=viewarticle&artid=39
http://site2.com/dir/modules/sections/index.php?op=viewarticle&artid=37

Где может быть ошибка?
Может быть на хосте что-то не так прописано?
Автор: Mavrikii
Дата сообщения: 15.09.2015 08:13
memo
обслуживается все одним сервером и из одной папки?
если нет, то проще всего использовать http://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect


Цитата:
Где может быть ошибка?

флаг QSA нужно добавить. ну и ваше правило не сработает, так как оно предназначено чисто для папки /dir/, а не всего того, что может в ней находиться.

RewriteRule ^dir\/?(.*)$ http://site2.com/dir/$1 [QSA,R=301,L]

не проверял. в ссылке справа регулярка уже не применяется, поэтому ничего экранировать не нужно.
Автор: memo
Дата сообщения: 15.09.2015 15:47
Mavrikii

да, спасибо, мне подсказали, что надо использовать динамическое перенаправление и правило rewrite regex

а насчёт /dir/ сказали то же, что это чисто для папки

вроде переоценил возможности cPanel

где можно найти простой-понятный материал с rewrite regex или как с его помощью написать то, что мне надо?
Автор: Mavrikii
Дата сообщения: 15.09.2015 18:17
memo

Цитата:
или как с его помощью написать то, что мне надо?

я же написал основную часть. материал в шапке.
Автор: Mafia80
Дата сообщения: 12.10.2015 17:36
Помогите, стоит ЧПУ, доступа к htaccess пока нет, обещают в скором времени.

Смысл в том чтобы определенные страницы на старом сайте (old.ru) были доступны по прямым ссылкам поисковика c нового сайта (new.ru). пути не пересекаются.

Например надо чтобы при запросе страницы new.ru/articles/view/10.html (которой не существует), открывалась страница на old.ru/articles/view/10.html.. при этом надо чтобы было все максимально прозрачно как если бы это открывалось на первоначальном сайте.

как пример мне дали код вида:
RewriteRule /articles/view/(.*).html http://domain.com/articles/view/$1.html [R=301,L]

так же надо будет дописать правила для других папок, включая прямые уникальные без ЧПУ..
/articles/?page=3
/about.html
/discounted/?page=2&type=discounted
Автор: Sutar
Дата сообщения: 12.05.2016 12:29
Есть такой готовый код:



Код: RewriteRule ^(page1|page2|page3)(|/(|([0-9]+)))$ page.php?page=$1&id=$3 [NS,L]

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.