Как сделать редирект (301, 302). Общая тема

MG
На сайте с 29.07.2014
Offline
50
#641

jkm, спасибо! а какой вариант правильный из того, что я выше написал?

---------- Добавлено 12.03.2018 в 01:57 ----------

Sitealert, то есть в моих вариантах будет правильным второй вариант написания, верно?

---------- Добавлено 12.03.2018 в 02:03 ----------

У меня стоит Апач 2.4.10

S
На сайте с 30.09.2016
Offline
469
#642
MishGU:
будет правильным второй вариант написания, верно?

Если site.ru - дефолтный вариант, и запросы на него приходят в этот же каталог, то правильно будет выкинуть второй абзац, а вместо 4-го написать

RewriteCond %{HTTP_HOST} !site\.ru [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Потёрто....

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
MG
На сайте с 29.07.2014
Offline
50
#643

Sitealert, то есть вот это будет оптимально правильным написание?

RewriteCond %{REMOTE_ADDR} ^x\.x\.x\.x$ [OR]

RewriteCond %{REMOTE_ADDR} ^y\.y\.y\.y$

RewriteCond %{HTTP_HOST} ^(www\.)?site1\.ru$ [NC]

RewriteRule ^ https://google.ru [R=301,L]

RewriteCond %{HTTP_HOST} !site\.ru [NC]

RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

RewriteCond %{REMOTE_ADDR} ^x\.x\.x\.x$ [OR]

RewriteCond %{REMOTE_ADDR} ^y\.y\.y\.y$

RewriteCond %{HTTP_HOST} ^(www\.)?site2\.ru$ [NC]

RewriteRule ^ https://yandex.ru [R=301,L]

RewriteCond %{HTTP_HOST} !site\.ru [NC]

RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

---------- Добавлено 12.03.2018 в 02:21 ----------

Sitealert, а не, неправильно

вот так правильно, да?

RewriteCond %{REMOTE_ADDR} ^x\.x\.x\.x$ [OR]

RewriteCond %{REMOTE_ADDR} ^y\.y\.y\.y$

RewriteCond %{HTTP_HOST} ^(www\.)?site1\.ru$ [NC]

RewriteRule ^ https://google.ru [R=301,L]

RewriteCond %{REMOTE_ADDR} ^x\.x\.x\.x$ [OR]

RewriteCond %{REMOTE_ADDR} ^y\.y\.y\.y$

RewriteCond %{HTTP_HOST} ^(www\.)?site2\.ru$ [NC]

RewriteRule ^ https://yandex.ru [R=301,L]

RewriteCond %{HTTP_HOST} !site\.ru [NC]

RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Если правильно, то я понял логику))

S
На сайте с 30.09.2016
Offline
469
#644

Как-то так. И тестируйте - мало ли что вылезти может.

MG
На сайте с 29.07.2014
Offline
50
#645

Sitealert, большое спасибо!

И ещё вопрос

можно ли вот эту часть заменить какой-то константой? у меня будет порядка 30 условий в этих строках

RewriteCond %{REMOTE_ADDR} ^x\.x\.x\.x$ [OR]

RewriteCond %{REMOTE_ADDR} ^y\.y\.y\.y$

---------- Добавлено 12.03.2018 в 02:25 ----------

30 диапазонов айпи адресов

S
На сайте с 30.09.2016
Offline
469
#646

Можно, наверное, объединить абзацы с одинаковыми условиями по IP - если он одинаковые (то есть 2, или сколько там их у Вас, первые строки одинаковые - потом ветвление по доменам).

Можно использовать условие по подсетям (выше jkm показал).

Можно использовать возможности регулярных выражений - но это Вы и сами знаете.

MG
На сайте с 29.07.2014
Offline
50
#647

Sitealert, да, с регулярными выражениями меньше получается , чем по CIDR )

условия по IP одинаковые, но условия по доменам, с которых редирект разные.

Как можно объединить условия по IP адерсам, подскажите, пожалуйста)

J
На сайте с 20.02.2014
Offline
120
jkm
#648

Если доступен mod_setenvif, то можно по условию ставить своё значение в переменную окружения, а в RewriteCond проверять её значение.


SetEnvIfExpr "-R '111.1.0.0/16' || -R '222.2.2.0/24' || -R '127.0.0.0/8'" ipblock=1

RewriteCond %{ENV:ipblock} 1
RewriteCond %{HTTP_HOST} ^(www\.)?site1\.ru$ [NC]
RewriteRule ^ https://google.ru [R=301,L]

RewriteCond %{ENV:ipblock} 1
RewriteCond %{HTTP_HOST} ^(www\.)?site2\.ru$ [NC]
RewriteRule ^ https://yandex.ru [R=301,L]

Если вдруг нет mod_setenvif, то можно и без него.

Поместить всё в одно правило.


RewriteCond expr "-R '111.1.0.0/16' || -R '222.2.2.0/24' || -R '127.0.0.0/8'"
RewriteCond %{HTTP_HOST} ^(www\.)?(site1\.ru|site2\.ru)$
RewriteCond "%2 \
site1.ru => google.ru \
site2.ru => yandex.ru " "^(\S+) .*? \1 => (\S+)"
RewriteRule ^ https://%2/ [R=301,L]
MG
На сайте с 29.07.2014
Offline
50
#649

jkm, спасибо!

а что означают значения || -R ?

и вот это "%2 \

и вот это что делает после яндекса " "^(\S+) .*? \1 => (\S+)" ?

J
На сайте с 20.02.2014
Offline
120
jkm
#650

[OR] и || это всё логическое "ИЛИ".

-R '222.2.2.0/24' это компактная форма записи "%{REMOTE_ADDR} -ipmatch '222.2.2.0/24'"

http://httpd.apache.org/docs/2.4/expr.html

Обратная косая черта "\" в конце строки указывает, что директива продолжается следующую строку.

Для удобства можно поделить длинную строку RewriteCond "%2 site1.ru => google.ru site2.ru => yandex.ru " "^(\S+) .*? \1 => (\S+)" на несколько более коротких.

Между обратной косой чертой и концом строки не должно быть других символов или пробелов.

http://httpd.apache.org/docs/2.4/configuring.html


httpd configuration files contain one directive per line. The backslash "\" may be used as the last character on a line to indicate that the directive continues onto the next line. There must be no other characters or white space between the backslash and the end of the line.

Если есть доступ править httpd.conf, то для списка доменов удобнее rewritemap

RewriteMap доступен в контексте <VirtualHost>, а не .htaccess

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий