Назад | Перейти на главную страницу

Как перенаправить из одной подпапки в подпапку с помощью htaccess

У меня такая структура папок:

/fonts
  /myfont.eot
  /myfont.svg
  /myfont.ttf
  /myfont.woff
  /myfont.woff2
/content
  /page1
    /files
      /logo.png
      /style.css
    /index.html
  /page2
    /files
      /logo.png
      /style.css
    /index.html
  /page3
    /files
      /logo.png
      /style.css
    /a
      /index.html
    /b
      /index.html
  ...

Называемые URL-адреса выглядят так:

Теперь все, чего я хочу достичь, .htaccess файл, расположенный в /page3 это тот, кто посещает example.com/content/page3 правильно перенаправляет на example.com/content/page3/a (или example.com/content/page3/a/index.html, Меня не волнует, есть ли имя файла в URL-адресе или нет).

Я попытался

DirectoryIndex /content/page3/a/index.html

но в этом случае, когда я открываю example.com/content/page3 все относительные ссылки в /a/index.html файл поврежден из-за отсутствия уровня каталога в URL-адресе. Кроме того, при звонке example.com/content/page3/a работает, example.com/content/page3/b дает 403 Запрещено.

Я попытался

Redirect 301 /content/page3 /content/page3/a

но это, очевидно, приводит к бесконечной спирали перенаправления на example.com/content/page3/a/a/a/a/a/a/...... пока сервер не перестанет пытаться.

Итак, я решил, что мне нужно немного RedirectCond и RedirectRule конфигурация. К сожалению, я не понимаю синтаксис, и все примеры, на которые я смотрел, делают это на верхнем уровне с более сложными вещами, такими как перенаправление файлов и подпапок, иногда в другой домен и т. Д.

Я пробовал это

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteCond %{REQUEST_URI} ^/content/page3/$
RewriteRule ^/content/page3/?$ /content/page3/a [L]

потому что я решил, что это заменит "/ content / page3" на "/ content / page3 / a", но безрезультатно, ничего не делает.

Я теперь использовал

DirectoryIndex /content/page3/a/index.html index.html

и заменил относительные ссылки в документе абсолютными. Это работает.

Но во-первых, я бы предпочел, чтобы ссылки оставались относительными, чтобы документ не сломался, если page3 папка когда-либо переименовывается, а во-вторых, я бы предпочел /a подкаталог в URL-адресе для ясности относительно того, что отображается.

Как я могу этого добиться?

Я все же предпочел бы, чтобы ссылки оставались относительными

В этом случае вам действительно понадобится внешний прямой, а не внутреннюю перезапись или внутренний подзапрос (что вы, по сути, делаете с DirectoryIndex директива). И если вы предпочитаете /a подкаталог в URL-адресе "тогда вам определенно понадобится внешнее перенаправление.

Называемые URL-адреса выглядят так:

  • example.com/content/page1
  • example.com/content/page2
  • example.com/content/page3/a
  • example.com/content/page3/b

Замечу, что вы не добавили завершающие слэши ни в один из этих URL-адресов, которые соответствуют физическим каталогам. Они должны содержать завершающие слэши для обозначения того, что вы пытаетесь сделать. т.е. ссылка на example.com/content/page1/не example.com/content/page1. Причина в том, что Apache (mod_dir) в противном случае «исправит» URL-адрес с перенаправлением 301, добавив в конце косую черту. Если вы действительно хотите опустить косую черту в конце этих URL-адресов «каталогов», у вас есть над чем поработать.

ан .htaccess файл, расположенный в /page3

Используя mod_rewrite, вы можете делать следующее:

RewriteEngine On
RewriteRule ^$ /content/page3/a/ [R,L]

Это временное (302) перенаправление. ^$ соответствует пустому URL-пути. Он «пустой», потому что он относится к текущему каталогу. mod_dir затем выдаст подзапрос для DirectoryIndex, т.е. index.html.

В качестве альтернативы используйте mod_alias RedirectMatch:

RedirectMatch 302 ^/content/page3/?$ /content/page3/a/
RewriteRule ^/content/page3/?$ /content/page3/a [L]

Это никогда не сработает, потому что в контексте каталога (т.е. .htaccess) URL-путь, которому соответствует RewriteRule шаблон не начинается с косой черты.

Если вы написали это в корень .htaccess файл, он должен читать:

RewriteEngine On
RewriteRule ^content/page3/?$ /content/page3/a/ [R,L]

Два предыдущих условия не требуются - если у вас не несколько доменов?

Соответствующая директива mod_alias будет такой же, как указано выше (независимо от того, где .htaccess файл находится).


В DirectoryIndex следует просто установить на:

DirectoryIndex index.html

Чтобы служить index.html документ из запрошенного каталога.


Redirect 301 /content/page3 /content/page3/a

Это создаст цикл перенаправления, потому что mod_alias Redirect директива префикс соответствие, и все, что находится после совпадения, добавляется к целевому URL. т.е. Перенаправленный URL /content/page3/a совпадает с исходным URL /content/page3 и /a добавляется в конец цели (/content/page3/a) стать /content/page3/a/a и т. д. и т. д.

Обратите внимание, что 301 (постоянное) перенаправление постоянно кэшируется браузером. Вам нужно будет очистить кеш браузера. Всегда тестируйте с 302 (временными) перенаправлениями и меняйте на 301 (постоянное) - если это намерение - только после того, как вы подтвердите, что все работает нормально.