Форум об интернет-маркетинге
Вернуться   Форум об интернет-маркетинге > Технические вопросы > Веб-строительство

Ответ
 
Опции темы
Старый 28.06.2020, 19:24   #1
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

Thread Starter Как сделать редиректы – 301 и другие

Тема касается в основном вопросов по редиректам в файле .htaccess. Потому что те, у кого нет апача и стоит только nginx на VDS/VPS, прописывают всё, что надо, в конфигурации сервера, и подобных вопросов не задают. А вот пользователи shared-хостингов с этим сталкиваются частенько, а знаний у них не хватает.
Итак, в Apache за редирект отвечают директивы, прописываемые в двух разных модулях: mod_alias и mod_rewrite. Через mod_alias обычно делают более простые редиректы, выглядят они примерно так:
Код:
Redirect 301 /one https://site.com/two
Redirect permanent /one https://site.com/two
RedirectPermanent /one https://site.com/two

RedirectMatch 301 ^/\d+-(\w+)/(.*)$ /$1/$2
Первые 3 правила эквивалентны одно другому, это простой редирект со статусом 301 с одного адреса ("/one") на другой ("https://site.com/two"). Четвёртое правило – это редирект с использованием регулярных выражений.

Через mod_rewrite можно прописать более сложный редирект, с использованием условий редиректа:
Код:
RewriteEngine on

RewriteCond %{HTTP_HOST} ^site\.com
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^index2\.php$ /index.php [R=301,L]
Первая строка – это запуск самого модуля mod_rewrite. Не надо писать эту строку несколько раз! И в большинстве случаев в готовом файле .htaccess она уже прописана.
Вторая и третья строки - это условия редиректа, в данном случае редирект выполняется, если выполнены оба условия. Если требуется сделать редирект при выполнении хотя бы одного условия, то в конце первого условия через пробел пишут флаг [OR].
Четвёртая строка – тоже условие, но оно не сработает, потому что закомментировано символом #.
Последняя строка – это правило редиректа. Флаг [R] означает, что должен произойти внешний редирект (через браузер) на данный URL, в противном случае произойдёт рерайт адреса на внутренний файл сервера. Если написать R вместо R=301, то произойдёт редирект 302. Флаг [L] означает, что обработка данной последовательности директив закончена.
В качестве условий и входящего пути правила подразумеваются регулярные выражения, поэтому не забывайте экранировать спецсимволы регулярок обратным слэшем: \.
Обратите внимание, что входящий путь правила mod_alias начинается со слэша (/index.php), а входящий путь правила mod_rewrite – без слэша в начале (index2\.php).

Это "минимум миниморум" для грамотного написания редиректов через .htaccess – а дальше спрашиваем и отвечаем.
Sitealert вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Старый 29.06.2020, 10:48   #2
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

Thread Starter Re: Как сделать редиректы – 301 и другие

Вопрос: как сделать редирект при переносе сайта на другой домен, например с site1.com на site2.org?
Ответ: в подавляющем большинстве случаев достаточно разместить в корневом каталоге сайта файл .htaccess, состоящий всего из двух строк:
Код:
RewriteEngine on
RewriteRule ^(.*)$ https://site2.org/$1 [R=301,L]
При этом предполагается, что структура URL и контент сайта по соответственным адресам сохраняются, данный корневой каталог служит только для одного сайта, и сайт будет доступен по адресу https://site2.org.
В других случаях необходимо добавить условие редиректа, и/или изменить правило редиректа. Например, если сервер сконфигурирован таким образом, что данный корневой каталог работает для сайтов site1.com и forum.site1.com, а надо перенести только forum.site1.com, то в файл .htaccess сразу после директивы "RewriteEngine on" следует внести следующие строки:
Код:
RewriteCond %{HTTP_HOST} ^forum\.site1\.com [NC]
RewriteRule ^(.*)$ https://site2.org/$1 [R=301,L]
При этом, если .htaccess служит для правильной работы другого сайта, то остальную его часть следует оставить неизменной.
Sitealert вне форума   Ответить с цитированием
Старый 29.06.2020, 11:49   #3
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

Thread Starter Re: Как сделать редиректы – 301 и другие

Вопрос: как сделать, чтобы после переезда с http:// на https:// при запросе по http происходил обязательный редирект?
Ответ: это зависит от настроек сервера, то есть от того, какая серверная переменная изменяется при изменении запроса. Выяснить это можно несколькими способами:
- узнать у техподдержки хостинга
- посмотреть содержимое массива $_SERVER
- методом проб и ошибок.
В простейшем случае запись для редиректа выглядит следующим образом:
Код:
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://site.com/$1 [R=301,L]
Возможные варианты условия редиректа:
Код:
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTPS} =off 
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-HTTPS} !1  
RewriteCond %{ENV:HTTPS} !on
RewriteCond %{SERVER_PORT} !^443$ 
RewriteCond %{HTTP:X-Forwarded-Protocol} !=https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
Возможны также разные правила редиректа, если необходима универсальность для разных хостов/сайтов:
Код:
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Возможен вариант с одновременным редиректом с http на https и с www на "без www":
Код:
RewriteCond %{HTTP:X-HTTPS} !1 [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://site.com/$1 [R=301,L]
Sitealert вне форума   Ответить с цитированием
Старый 29.06.2020, 14:58   #4
XPraptor
Думаю, что надо худеть
Академик
 
Аватар для XPraptor
 
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 608321

По умолчанию Re: Как сделать редиректы – 301 и другие

Sitealert, для редиректа на https достаточно универсальной проверки:
Код:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Она на всех современных хостингах сработает. Редко найдется исключение, где нужно будет добавить переменных.
XPraptor вне форума   Ответить с цитированием
Старый 29.06.2020, 15:22   #5
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

Thread Starter Re: Как сделать редиректы – 301 и другие

Цитата:
Сообщение от XPraptor Посмотреть сообщение
нужно будет добавить переменных.
Обычно приходится не добавлять, а выбирать. Смотрим $_SERVER и пишем, что надо.
Sitealert вне форума   Ответить с цитированием
Старый 04.07.2020, 20:14   #6
oleg_ws
На серче с 01.11.2011
Аспирант
 
Регистрация: 02.07.2020
Сообщений: 68
Сказал(а) спасибо: 186
Получил(а) "Спасибо": 56
Нарушения: 0/0 (0)
Репутация: 2613

По умолчанию Re: Как сделать редиректы – 301 и другие

Иногда делаю на php в зависимости от логики
PHP код:
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://domain.ru/test.html");
exit(); 
oleg_ws вне форума   Ответить с цитированием
Старый 23.09.2020, 16:23   #7
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

Thread Starter Re: Как сделать редиректы – 301 и другие

Цитата:
Сообщение от lkolobok Посмотреть сообщение
В общем есть скажем сайт, у которого поддоменов так 100.
Хотим что бы при наборе несуществующего поддомена происходил редирект на основной.
a.site.ru - существует, открывается отдельный сайт
b.site.ru - не существует, надо редиректить на site.ru
Как можно реализовать?
Для случая, когда в DNS прописана wild-карта для поддоменов, а на сервере нет отдельного каталога для поддомена и есть .htaccess в общем каталоге, прописываем условие по несовпадению с разрешёнными именами:
Цитата:
RewriteCond %{HTTP_HOST} !(^a\.site\.ru|c\.site\.ru|d\.site\.ru|e\.site\.ru $) [NC]
RewriteRule ^ http://site.ru [R=301,L]
Sitealert вне форума   Ответить с цитированием
Старый 09.11.2020, 00:10   #8
XPraptor
Думаю, что надо худеть
Академик
 
Аватар для XPraptor
 
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 608321

По умолчанию Re: Как сделать редиректы – 301 и другие

Ахтунг всем у кого на хостинге работает апач без фронтендов и кто проверяет https в .htaccess запросами:

Код:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Вчера обновился апач и в remote_ip ушли инструкции fcgi, это значит, что апач не транслирует больше заголовок HTTP:X-Forwarded-Proto, а поступает как будто он за фронтендом.

Поэтому теперь нужно проверять порт еще,чтобы конструкция работала и на старой версии и на обновленной.

То есть добавляем строку порта и наша проверка теперь выглядит вот так:
Код:
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Эти строки работают везде, в любом варианте в любой конфе и в обновленном апаче тоже.

Если не добавить строку порта, то после обновы апача сайт уйдет в вечный редирект.
XPraptor вне форума   Ответить с цитированием
Сказали спасибо:
Ответ

Метки
.htaccess , редирект

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 00:29. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc. Перевод: zCarot