php — Три последовательных 301 редиректа объединить в один
Вопрос задан
Изменён 3 месяца назад
Просмотрен 24 раза
Помогите пожалуйста объединить 301 последовательных редиректы в один. Пытался сам, но чего то я не могу понять.
http://www.example.com/index.php?asd=asd -> https://example.com
Нужно :
- редирект с http на https
- редирект с www.example.com на example.com
- редирект с example.com/index.php на example.com/
- редирект с example.com/ на example.com ( но только на главной, на остальных случаях, в конце, слэш нужно оставить )
Нужно объединить в один.
Сейчас происходит три 301 редиректа :
- 301 http://www.example.com/index.php?asd=asd
- 301 http://example.com/index. (.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Заранее спасибо !
- php
- .htaccess
- redirect
- редирект
- 301
1
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
ПочтаНеобходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Что такое htaccess, редирект через htaccess и изменение адресов с mod_rewrite
Файл «. htaccess» (с точкой в начале названия файла) — это конфигурационный файл Apache. Он позволяет изменять глобальные настройки в некоторых конкретных директориях. К примеру, делать переадресацию (редиректы), отключать обработку PHP файлов. Файл «.htaccess» — это текстовый документ, который можно изменить в любом текстовом редакторе. Обычно на хостингах данный файл изначально присутствует в корневой папке сайта. Но вы можете создать несколько файлов «.htaccess» в любых подпапках. Тогда правила будут перезаписываться.
Простой редирект через .htaccess
Разберём одну из самых популярных задачу, которую возлагают на файл «.htaccess» — это переадресация посетителя сайта на другую страницу. Откройте файл .htaccess в корневом каталоге сайта и в самом начале, первой строчкой напишите:
Redirect 301 / https://mousedc.ru
301 означает, что во время перенаправления пользователя сервер выдаст код ответа 301-«Permanent Redirect», что означает, что документ перенесён на новый навсегда.
Некоторые возможные HTTP статусы:
301 — документ перемещен постоянно
302 — документ перемещен временно
303 — смотрите другой документ
403 — документ запрещён к просмотру
404 — документ не найден
410Слеш «/» после 301 означает, что перенаправление будет срабатывать в любом случае, к какой бы странице или файлу не обратился пользователя. Если вместо слеша поставить адрес файла, к примеру:
Redirect 301 /folder/page1.php https://mousedc.ru
— то будет происходить переадресация только в том случае, если пользователь запросит страницу «/folder/page1.php».
Последним параметром для Redirect стоит адрес страницы, на которую будет сделано перенаправление. В примере это «https://mousedc.ru».
Редирект с регулярным выражением через .htaccess
RedirectMatch 301 (.*) https://mousedc.ru$1
Чтобы понять, что происходит в этом коде, рекомендуем прочитать все статьи о регулярных выражениях, начиная с Регулярные выражения в PHP. Если кратко, то образуется карман (.*), значение которого подставляется в самый конец домена, вместо $1 в строке https://mousedc.ru$. В кармане находится относительный адрес запрашиваемой страницы (то есть без домена).
Использование регулярного выражения полезно для переадресации обращения к файлам. К примеру, сделаем переадресацию при запросе jpg картинок:
RedirectMatch 301 (.*\.jpg)$ https://mousedc.ru/example.jpg
Изменение адресов и Mod_rewrite
Mod_rewrite — модуль, используемый Apache для преобразования адресов. Во время преобразования адресов происходит обращение к одному файлу, запрашиваемому по другому адресу. product/([0-9]+)/?$ product/index.php?id=$1 [L]
При таком правиле пользователь будет заходить на страницу
, а сервер будет возвращать содержание страницыmousedc.ru/product/index.php?id=5
.В конце правила можно заметить квадратные скобки. В эти скобки [ ] ставятся флаги. Можно поставить один флаг, к примеру, [L] и несколько флагов через запятую [NC,R=301,L]. Приведём значения самых популярных из них:
- R — вызывает редирект. Можно казать после этого флага код ответа сервера, например [R=301]
- L — останавливает процесс изменения адреса. Означает, что следующие RewriteRule после этой строчки не будут выполнены
- N — перезапускает преобразование адреса заново, начиная с первого правила. Но на этот раз подставляется адрес, изменённый в процессе проделанных преобразований. Будте осторожны, чтобы не сделать бесконечный цикл
- C — если следующее после этого правило не выполняется, то преобразование будет прервано. products/(.*)$ /products.php [L,R=301]
— такое правило может пригодиться, если нужно закрыть давно существующий раздел, но не хочется терять ссылочную массу.
Закажите недорогой хостинг Заказать
всего от 290 руб
перенаправление — .htaccess: ??/index.php —> ??/, построено на относительном пути
в конфиге сервера, хотя по умолчанию
index.html только
) — для этого вам не нужен mod_rewrite. Например:# Подавать "index.php" из запрошенного каталога DirectoryIndex index.php
Это указывает Apache обслуживать
index.php
из любого запрошенного каталога. например. Запрос/foo/bar/
, затем/foo/bar/index.php
обслуживается через внутренний подзапрос (без перенаправления). Еслиindex.php
отсутствует в этом каталоге, вы получите ответ 403 Forbidden (при условии, что списки каталогов, сгенерированные mod_autoindex, отключены).Вышеперечисленное перенаправляет следующим образом, сохраняя запрошенный протокол и имя хоста:
-
/index.php
на/
-
/foo/index.php
до/foo/
-
/foo/bar/index.php
до/foo/bar/
-
/fooindex.php
— НЕТ ПЕРЕНАПРАВЛЕНИЯ (ожидается 404) -
/foo/index.php/bar
(содержит информацию о пути) на/foo/
(информация о пути удалена) -
/foo/index.phpbar
— НЕТ ПЕРЕНАПРАВЛЕНИЯ (ожидается 404)
Группа захвата (необязательно)
(.*/)?
содержит часть URL-пути доindex.php
. Это затем доступно в строке замены с использованием обратной ссылки$1
. В случае, когда в корне документа запрашивается/index.php
, это пустой . Когда присутствует подкаталог, он содержит строку видаsubdir/
, включая завершающую косую черту.Если у вас нет других директив в вашем файле
.htaccess
, вам не нужно строго условие , которое проверяет переменную среды
. Это условие гарантирует, что перенаправляются только прямые запросы в случае, если у вас есть шаблон переднего контроллера позже в файле, который может переписать запросы наindex.php
.Если в файле есть другие директивы, порядок может быть важен. Это правило, которое удаляет
index.php
через внешнее перенаправление должно пройти до любых существующих перезаписей, в верхней части файла.Обратите внимание, что это удаляет
index.php
из URL-адреса независимо от того, действительно ли запрошенный URL-адрес отображается в реальный файл или существует ли предыдущий URL-путь как физический каталог. Итак,/<что-то>/index.php
перенаправляется на/<что-то>/
независимо от того, является ли/<что-то>/
физическим каталогом или нет. Эта проверка может быть реализована за счет дополнительной проверки файловой системы, но, вероятно, она не требуется.NB: Сначала проверьте с 302 (временной) переадресацией, чтобы избежать потенциальных проблем с кэшированием. Меняйте редирект на 301 (постоянный) только после того, как вы проверили, что он работает должным образом.
ОБНОВЛЕНИЕ №1:
Эти вопросы не дают ответа:
На самом деле, первый вопрос, который вы связали с , отвечает на ваш вопрос об удалении
index.php
из запрошенного URL. Он делает адресных подкаталога и перенаправляетexample.tld/dir/index.php
—example.tld/dir/
(а неexample.tld/
, как вы сказали).Часть вопроса, в которой обсуждаются субдомены, немного вводит в заблуждение, поскольку на самом деле не имеет ничего общего с субдоменами.
Решение, представленное в связанном вопросе, в основном делает то же самое, что я сделал выше, за исключением того, что оно, возможно, слишком много (и недостаточно). Это будет неправильно/ненужно перенаправлять
/fooindex.php
на/foo
(без косой черты в конце) и не сможет перенаправить URL-адреса, содержащие информацию о пути (что может быть вредоносным). например./foo/index.php/bar
не сможет перенаправить, но по-прежнему будет обслуживать содержимое/foo/index.php
(если толькоAcceptPathInfo
не отключен). Хотя действительно ли эти «ошибки» вызовут проблему в вашем случае, это другой вопрос.ОБНОВЛЕНИЕ №2:
у меня код точно в директории на 9|/)индекс\.php(/|$) /%1 [R=301,L]
Обратная ссылка
%1
(в отличие от$1
) относится к захваченной группе в предыдущем CondPattern . Это, естественно, включает в себя полный URL-путь, поэтому вам не нужно жестко кодировать каталог, в котором находится файл.htaccess
.Это относится к каталогу, который содержит файл
. htaccess
и любые его подкаталоги. Обратите внимание, что по умолчанию это полностью переопределяет любые директивы mod_rewrite, которые могут присутствовать в родительском.htaccess
файл (директивы mod_rewrite по умолчанию не наследуются).…включая подкаталоги, которые могут иметь свои собственные .htaccess и index.php.
Если в дополнительных подкаталогах есть собственный файл
.htaccess
, то это может работать или не работать в зависимости от директив, используемых в этих файлах.htaccess
подкаталога и/или от того, как настроено наследование mod_rewrite.Директивы mod_rewrite не наследуются по умолчанию. Итак, если
.htaccess
в подкаталоге включает механизм перезаписи, тогда указанные выше директивы mod_rewrite в родительском каталоге будут полностью переопределены (они даже не обрабатываются).Если, с другой стороны, файл
.htaccess
в подкаталоге использует директивы из других модулей, это может не быть проблемой.apache2 — .htaccess перенаправить подпапки на соответствующий index.php
Как я могу перенаправить каждый запрос на подпапку на index.php в той же папке 9.*$ index.php [L, QSA]
Я хотел бы перенаправить их одним .htaccess в родительскую папку:
Папка/ .htaccess <-- здесь одно перенаправление подпапка1/ index.php подпапка2/ index.php подпапка3/ index.php ... подпапка н/ index.php
П.С. : все вложенные папки имеют разные имена и не соответствуют соглашению об именах.
- .htaccess
- apache2
Вам просто нужно убедиться, что
DirectoryIndex
правильно установлен в корневом файле.htaccess
. (По умолчанию этоindex.html
, хотя многие дистрибутивы также включаютindex.php
, поэтому вам часто не нужно ничего делать!)Например:
DirectoryIndex index.
-