У меня такая структура папок:
/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-адреса выглядят так:
example.com/content/page1
example.com/content/page2
example.com/content/page3/a
example.com/content/page3/b
Теперь все, чего я хочу достичь, .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 (постоянное) - если это намерение - только после того, как вы подтвердите, что все работает нормально.