Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
system:apache:rewrite [2022/01/16 00:38] mirocowsystem:apache:rewrite [2022/01/16 01:07] (текущий) – [Вопрос / ответ] mirocow
Строка 403: Строка 403:
 Директива RewriteRule устанавливает правила перехода. Синтаксис следующий: Директива RewriteRule устанавливает правила перехода. Синтаксис следующий:
  
-RewriteRule Шаблон Подстановка [коды]+<code>RewriteRule Шаблон Подстановка [коды]</code>
  
 Директива RewriteCond Директива RewriteCond
 Директива RewriteCond определяет условия при котором выполняется правила в RewriteRule. Директива RewriteCond определяет условия при котором выполняется правила в RewriteRule.
  
-RewriteCond Сравниваемая_Строка Условие+<code>RewriteCond Сравниваемая_Строка Условие</code>
  
 Например, этими условиями могут быть браузер пользователя, IP-адрес, заголовок и т.д. Например, этими условиями могут быть браузер пользователя, IP-адрес, заголовок и т.д.
Строка 415: Строка 415:
 Директива RedirectMatch в htaccess аналогична Redirect с той лишь разницей, что позволяет записывать регулярные выражения. Директива RedirectMatch в htaccess аналогична Redirect с той лишь разницей, что позволяет записывать регулярные выражения.
  
-RedirectMatch [status] Откуда Куда +<code>RedirectMatch [status] Откуда Куда</code>
-Источник: https://biznessrussia.ru/dom-i-dacha/redirekt-s-papki-na-papku-htaccess.html+
  
 +==== Вопрос / ответ ====
  
 +Примеры настройки 301 редиректов в htaccess
 +
 +<code>Options +FollowSymLinks
 +RewriteEngine On</code>
 +
 +Комментарий в файле htaccess обозначается символом решётка «#» в начале строки
 +# Текстовый комментарий, данная строчка не будет обрабатываться.
 +301-редирект с домена без WWW на домен с WWW префиксом
 +
 +<code>RewriteCond % ^site\.ru$ [NC]
 +RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]</code>
 +
 +С домена с WWW префиксом на без
 +
 +<code>RewriteCond % ^www.site\.ru$ [NC]
 +RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]</code>
 +
 +Для HTTPS-версии:
 +
 +<code>RewriteCond % ^80$ [OR]
 +RewriteCond % =on
 +RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]</code>
 +
 +Стандартный 301-редирект с одной статической страницы на другую
 +Redirect 301 /was.php http://www.site.ru/new.php
 +При этом в файле htaccess, новый адрес указывать необходимо полностью с http и доменным именем.
 +В ряде случаев полезен редирект через RewriteRule
 +
 +<code>RewriteRule ^dir /dir-new/$1 [R=301,L]</code>
 +
 +Настройка 301-редирект для страницы с GET параметрами
 +Скажем, адрес страницы имеет вид: http://www.htaccess.ru/dir/index.php?IBLOCK_ID=1&SECTION_ID=111 тогда в htaccess для настройки 301 редиректа на новый адрес, необходимо использовать следующее правило:
 +
 +<code>RewriteCond % ^IBLOCK_ID=1&SECTION_ID=111$ [NC]
 +RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]
 +</code>
 +
 +Если один (или несколько) из GET параметров не задан(ы) или может иметь произвольное значение (в нашем примере это SECTION_ID), можно использовать следующий код:
 +
 +<code>RewriteCond % ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC]
 +RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]</code>
 +
 +Убираем все GET-параметры после знака вопроса (?)
 +Располагать после: RewriteBase /
 +
 +301-редирект со страницы без заданного параметра в корень
 +Если адрес имеет следующий вид: http://www.htaccess.ru/?abc то для редиректа подойдет последовательность строчек:
 +
 +<code>RewriteCond % ^abc$ [NC]
 +RewriteRule ^$ /? [R=301,L]</code>
 +
 +301-редирект для конкретного файла, а не целой папки
 +RewriteRule ^dir/$ http://www.htaccess.ru/new-dir/ [R=301,L]
 +
 +Как быть с доменами в зоне РФ?
 +301-редирект с домена на домен
 +<code>RewriteCond % ^old-site\.ru$ [NC]
 +RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]</code>
 +
 +И для домена в зоне РФ:
 +
 +<code>RewriteCond % ^xn-. \.xn--p1ai$ [NC]
 +RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]</code>
 +
 +Настройка редиректа на папки со слешем в конце /
 +Настройка редиректа на папки без слеша (убираем слеш в конце)
 +301-редирект с домена на папку на другом домене
 +<code>RewriteCond % ^si-te\.ru$ [NC]
 +RewriteRule ^(.*)$ http://www.site.ru/si-te/ [R=301,L]</code>
 +
 +Редирект со всех файлов домена, кроме папки администратора bitrix
 +<code>RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301]
 +RewriteRule ^(.*)$ http://www.newsite.ru/new/ [L,R=301]</code>
 +
 +Редирект всех файлов в папке на заданный файл
 +<code>RewriteRule ^dir(.*)$ /new-file.php [L,R=301]</code>
 +
 +Редирект файлов из заданной папки кроме, определенного файла
 +<code>RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301]
 +RewriteRule ^dir(.*)$ /all.php [L,R=301]
 +</code>
 +
 +Смена страниц с html расширения на php расширение
 +<code>RedirectMatch 301 (.*)\.html$ http://www.new-site.ru$1.php</code>
 +
 +Перенос картинок / изображений из папки /img/ на поддомен
 +<code>RewriteRule ^img/(.+)\.jpg$ http://img.domain.ru/$1.jpg [R=301,L]</code>
 +
 +Задание типа индексной страницы (php, html, htm и другие)
 +Указывается порядок загрузки типов индексного файла, лежащих в корне каталога.
 +
 +<code>DirectoryIndex index.html index.php index.htm index.shtml</code>
 +
 +Редирект с индексной страницы php на саму папку (корень)
 +<code>RewriteCond % ^[A-Z]<3,9>\ /index\.php\ HTTP/
 +RewriteRule ^index\.php$ http://www.site.ru/ [R=301,L]</code>
 +
 +Для всех индексных страниц на сайте:
 +<code>RewriteRule ^(.*)index\.php$ http://www.site.ru/$1 [R=301,L]</code>
 +
 +Редирект с поддомена на основной домен второго уровня
 +<code>RewriteCond % ^test.site.ru$ [NC]
 +RewriteRule ^(.*)$ http://site.ru% [R=301,NC,L,QSA]</code>
 +
 +Редирект для заданного файла в различных директориях (папках)
 +<code>RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L]</code>
 +
 +Код позволяет поставить 301-редирект со всех папок вида http://htaccess.ru/***/uniqe-file.html на один файл в корне /unique-file.html. Бывает полезен при переделке сайта и изменении ссылок.
 +
 +<code>RewriteRule ^testovyi/test/?$ /studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]</code>
 +
 +Код позволяет создать копию страницы с относительным адресом /studio/news/detail.php?ID=230354&PAGEN_2=11 по адресу /testovyi/test/
 +
 +301-редирект с HTTPS-версии на HTTP
 +Позволяет устранить наличие дублей URL с HTTPS в индексе поисковых систем.
 +
 +Перенос сайта на версию с HTTPS (для всех страниц)
 +<code>RewriteCond % ^80$ [OR]
 +RewriteCond % =on
 +RewriteRule ^(.*)$ https://htaccess.ru/$1 [R=301,L]</code>
 +
 +Настройка 403 кода ответа сервера для реф-спама (301-редирект для спама по REFERER) для списка ресурсов
 +Настройка позволяет отклонить спамный реферальный трафик с ряда ресурсов по заголовку HTTP_REFERER.
 +
 +Внимание, важно чтобы код ответа сервера для 404 ошибки был именно 404. Путь к файлу указывается с помощью следующей строчки:
 +
 +<code>ErrorDocument 404 /404-for-me.php</code>
 +
 +! Для сайтов, на которых используется не сервер Apache, аналогичные 301-редиректы легко настраиваются с помощью PHP.
 +
 +<code>header(«HTTP/1.1 301 Moved Permanently»);
 +header(«Location: http://www.htaccess.ru/dir/»);
 +exit();
 +?></code>
 +
 +! Оптимально настраивать все редиректы сразу на конечную страницу (без промежуточных перенаправлений, в один шаг) это улучшает их восприятие со стороны поисковых систем и пользователей.
 +
 +Если требуется настроить редирект только для некоторых USER_AGENT’ов, а не для всех пользователей
 +<code>RewriteCond % (iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|j2me|symbian|series\ 60|symbos|windows\ mobile|windows\ ce|ppc|smartphone|blackberry|mtk|bada|windows\ phone) [NC]
 +RewriteRule (.*) http://mobile.htaccess.ru/ [L,R=301]</code>
 +
 +Если требуется настроить редирект для всех поисковых роботов (представлен список их USER_AGENT’ов)
 +<code>RewriteCond % !(accoona|ia_archiver|antabot|ask\ jeeves|baidu|dcpbot |eltaindexer|feedfetcher|gamespy|gigabot|googlebot |gsa-crawler|grub-client|gulper|slurp|mihalism|msnbot|worldindexer |ooyyo|pagebull|scooter|w3c_validator|jigsaw|webalta|yahoofeedseeker |yahoo!\ slurp|mmcrawler|yandexbot|yandeximages |yandexvideo|yandexmedia|yandexblogs|yandexaddurl|yandexfavicons |yandexdirect|yandexmetrika|yandexcatalog|yandexnews |yandeximageresizer) [NC]
 +RewriteRule (.*) http://no-search.site.ru/ [L,R=301]</code>
 +
 +Несколько простых редиректов
 +Редирект с www.htaccess.ru/component/content/?view=featured на www.htaccess.ru/
 +
 +<code>RewriteCond % ^view=featured$ [NC]
 +RewriteRule ^component/content/$ /? [R=301,L]</code>
 +
 +Редирект с www.htaccess.ru/index.php?idc=4&marea=6 на www.htaccess.ru/
 +
 +<code>RewriteCond % ^idc=4&marea=6$ [NC]
 +RewriteRule ^index\.php$ /? [R=301,L]</code>
 +
 +Синтаксис для регулярных выражений файла htaccess
 +  * . — Точка заменяет произвольный символ.
 +  * [abc] — обозначает перечень символов, совпадающих с буквами a, b, или с.
 +  * [^abc] — перечень символов, которые не входят в указанных диапазон. Совпадёт с любым символом, кроме a, b, или с.
 +  * * — означает, что предшествующий символ может повторяться (0 или более раз).
 +  * [abc]* — команда найдёт идущие подряд символы из заданного набора.
 +  * [^abc]* — с точностью до наоборот.
 +  * .* — заменяет абсолютно любой набор символов. “.*” — найдёт все подстроки между кавычками.
 +  * ^ — начало строки (в том случае, если используется в начале выражения).
 +  * $ — обозначает конец строки.
 +  * \w — буква, цифра или подчёркивание _.
 +  * \d — заменяет любую цифру.
 +  * \D — заменяет любой символ, но не цифру.
 +  * 9 — заменяет любую цифру.
 +  * [a-z] — любая буква от a до z (весь латинский набор символов) в нижнем регистре.
 +  * [A-Z] — любая буква от A до Z в ВЕРХНЕМ регистре.
 +  * [a-zA-Z] — любая буква от a до Z в любом регистре.
 +  * [a-Z] — то же самое.
 +
 +❓Как сделать 301 редирект папки
 +Сделать переадресацию папки необходимо в нескольких случаях – если вы перемещаете её в пределах сайта для сокращения url и оптимизации структуры, а также для редиректа 301 folder на поддомен. Два этих варианта я и рассмотрю.
 +
 +Редирект в пределах сайта
 +В первом случае сокращается адрес folder, поэтому структура становится более понятна ботам. Также можно собрать в одном месте материалы одной темы, что хорошо для оптимизации сайта. Например, есть папка:
 +
 +И нужно, чтобы она открывалась по адресу:
 +
 +При этом важно сохранить урл, изменив только папку корня, то есть, все страницы за folder-storage-directory должны открываться после folder-shipping.
 +
 +Проще говоря, есть адрес:
 +
 +А надо чтобы она открывалась по адресу:
 +
 +Поможет в этом код:
 +
 +В результате адрес сокращается и структура сайта более понятна ботам. Также плюшка оптимизации.
 +
 +Редирект папки на поддомен
 +Иногда требуется переадресация папки на поддомен. Такая неприхотливая нужда возникает, если надо сделать 301 не всего сайта, а только одной (двух, трёх) папки. Например, тематика вашего основного сайта слишком распылилась, и вы хотите разбросать её по поддоменам, собрав на каждом из них материалы одной темы.
 +
 +Предположим, есть папка:
 +
 +И надо сделать редирект 301 на:
 +
 +Поможет в этом код в htaccess:
 +
 +<code>RewriteRule ^ru/(.*)$ http://ru.site.ru/$1 [R=301,L]</code>
 +
 +Так можно перенести с основного сайта на поддомены всё ненужное, оставив на нём только важный контент одной направленности. Например, ранее вы создали сайт об автомобилях, куда впихивали всё об авто. Теперь вы хотите, чтобы на отдельных поддоменах была информация о кузове, ходовой части, тюнинге и т д. С помощью этого кода вопрос решается и пользователю не придётся копаться в винегрете, пытаясь найти нужную информацию.
 +
 +Для использования кодов просто замените в нём домен и папки на свои директории и вставьте в htaccess. Делаете редирект с одинаковым успехом на Joomla и других движках.
 +
 +Источник
 +
 +.htaccess
 +При изменении файла новый набор настроек сразу начинает работать и не требует перезагрузки web-сервера.
 +
 +
 +Провайдер хостинга может запретить применение определенных директив в целях безопасности или снижения нагрузки на сервер. Названия директив может меняться, в зависимости от используемой на сервере провайдера версии Apache.
 +
 +Директива должна иметь вид:
 +
 +<code>Options Indexes FollowSymLinks
 +AllowOverride All
 +Require all granted</code>
 +
 +/var/www/ по необходимости нужно заменить на свою директорию сайта.
 +
 +После внесения изменений не забудьте перезагрузить веб-сервер, предварительно проверив корректность конфигурации:
 +
 +Если вывод будет Syntax OK, то выполните: service httpd restart.
 +
 +Провайдеры по умолчанию включают эту настройку для папок с сайтами пользователей на виртуальном хостинге, а владельцам VPS/VDS и выделенных серверов нужно самостоятельно проверить у себя наличие такой конфигурации в Apache.
 +
 +Каждая строка файла означает определенную команду конфигурации (директиву) Apache.
 +
 +Пустые строки игнорируются.
 +
 +Для этого нажмите правой кнопкой мыши на файл, чтобы открыть контекстное меню с пунктом “Просмотр/Правка”.
 +
 +
 +Filezilla использует для редактирования текстовый редактор Notepad++, который должен быть установлен на локальный компьютер.
 +
 +
 +В случае, если файла в папке сайта нет, создайте его самостоятельно.
 +
 +
 +Ниже будут рассмотрены наиболее востребованные из настроек в контексте web-хостинга.
 +
 +Механизм перенаправления (редиректа) запросов
 +Затем следует перечень специальных команд для настройки перенаправления, в зависимости от конкретных условий.
 +
 +В своей работе механизм перенаправления mod_rewrite применяет специальную технологию программирования regexp для сравнения запросов с определенным шаблоном.
 +
 +Склейка разных адресов одного сайта
 +<code>RewriteEngine On
 +RewriteCond % ^www.mysite\.ru$ [NC]
 +RewriteRule ^(.*)$ http://mysite.ru/$1 [R=301,L]</code>
 +
 +1. Указание основного зеркала
 +Предназначен для того, чтобы преобразовать домен с www на URL без www. Достаточно ввести правило:
 +
 +<code>RewriteEngine On # включает работу
 +RewriteCond %{HTTP_HOST} ^www.название_вашего_сайта\ru$ [NC] #условия для начала перенаправления
 +RewriteRule ^( *)$ http://название_вашего_сайта_/$1 [R=301,L] #правило преобразования</code>
 +2. Перенос на https
 +На сегодняшний день поисковик Google активно призывает владельцев сайтов к использованию безопасного соединения, для чего необходимо перенаправлять пользователей с http на https при помощи кода:
 +
 +<code>RewriteEngine On
 +RewriteCond %(HTTPS) !on
 +RewriteRule (.*) https://%(HTTP_HOST)%(REQUEST_URL)</code>
 +3. Проставление слеша в конце адреса
 +Если вы не хотите, чтобы URL страницы заканчивался названием каталога http://название_вашего_сайта.ru/catalog, введите в файл код:
 +
 +<code>RewriteCond %{REQUEST_URI} /+[^\.]+$
 +RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]</code>
 +Выполнив данную команду, в дальнейшем после адреса в автоматическом режиме будет добавляться слеш: http://название_вашего_сайта.ru/catalog/
 +
 +4. Перенос домена
 +Изменив название сайта, не забудьте в .htaccess указать:
 +
 +<code>RewriteEngine on
 +RewriteCond %{HTTP_HOST} ^www\.yoursite.ru\.ru$ [NC]
 +RewriteRule ^(.*)$ http://www.your-site.ru/$1 [R=301,L]</code>
 +Оптимизируя сайт и под Яндекс, и под Google, изменение доменного имени может быть чревато неприятными последствиями. Инструкции в robots.txt, предназначенные для Яндекса, перекрываются 301-редиректом. Но этого можно не допустить, добавив в код правило:
 +
 +<code>RewriteEngine on
 +RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]
 +RewriteRule ^([^/]+) $1 [L]
 +RewriteCond %{HTTP_HOST} ^mysite\.ru
 +RewriteRule ^(.*)$ http://www.my-site.ru/$1 [R=301,L]</code>
 +
 +5. Запретные команды для поискового бота
 +В .htaccess, так же, как и в robots.txt, можно закрыть доступ к сайту для роботов поисковых систем:
 +
 +<code>RewriteEngine on
 +RewriteCond %{USER_AGENT} Googlebot
 +RewriteRule .* - [F] # F – выдает ошибку 403 – запрещено для сканирования</code>
 +
 +6. Редирект с одного сайта на другой
 +
 +<code>RewriteEngine On
 +RewriteCond %{HTTP_HOST} domain1.ua
 +RewriteRule (.*) http://domain2.ua/$1 [R=301,L]</code>
 +
 +Редирект с www на без www
 +
 +<code>Options +FollowSymLinks
 +RewriteEngine On
 +RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
 +RewriteRule ^(.*)$ http://%1/$1 [R=301,L]</code>
 +
 +Или более понятный синтаксис
 +
 +<code>Options +FollowSymLinks
 +RewriteEngine On
 +RewriteCond %{HTTP_HOST} ^www.domain\.com$ [NC]
 +RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]</code>