php — Три последовательных 301 редиректа объединить в один

Вопрос задан

Изменён 3 месяца назад

Просмотрен 24 раза

Помогите пожалуйста объединить 301 последовательных редиректы в один. Пытался сам, но чего то я не могу понять.

http://www.example.com/index.php?asd=asd -> https://example.com

Нужно :

  1. редирект с http на https
  2. редирект с www.example.com на example.com
  3. редирект с example.com/index.php на example.com/
  4. редирект с example.com/ на example.com ( но только на главной, на остальных случаях, в конце, слэш нужно оставить )

Нужно объединить в один.

Сейчас происходит три 301 редиректа :

  1. 301 http://www.example.com/index.php?asd=asd
  2. 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/5/, а сервер будет возвращать содержание страницы 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(/|$) /$1 [R=301,L]

      Вышеперечисленное перенаправляет следующим образом, сохраняя запрошенный протокол и имя хоста:

      • /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 , вам не нужно строго условие , которое проверяет переменную среды

      REDIRECT_STATUS . Это условие гарантирует, что перенаправляются только прямые запросы в случае, если у вас есть шаблон переднего контроллера позже в файле, который может переписать запросы на 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.