Перенаправление с index.html в его каталог с помощью.htaccess?
Для каждой страницы моего веб-сайта она называется index.html
и хранится в папке с именем страницы.
-
example.com/
служитexample.com/index.html
-
example.com/about/
служитexample.com/about/index.html
-
example.com/work/
служитexample.com/work/index.html
Хотя все ссылки на моем сайте имеют формат example.com/folder/
, как я могу перенаправить любые страницы, заканчивающиеся на index.html
, в родительский каталог, поскольку это мое предпочтение?
Поэтому перенаправьте example.com/index.html
на example.com/
и example.com/work/index.html
на example.com/work/
Что мне нужно в файле .htaccess
для перенаправления 301, как указано выше?
1 answers
Вы можете сделать это, используя mod_rewrite в верхней части вашего файла .htaccess
. В своей простейшей форме это было бы что-то вроде:
RewriteEngine On
# Remove "index.html"
RewriteRule (.*)index\.html$ /$1 [R=301,L]
Регулярное выражение (.*)index\.html$
соответствует любому URL-пути, который заканчивается на index.html
, и захватывает часть URL-пути до index.html
.
Обратная ссылка $1
содержит захваченный URL-путь перед index.html
. Это было бы пустым в случае example.com/index.html
или about/
в случае example.com/about/index.html
.
ОДНАКО вышеперечисленное не сработает, если вы также обслуживаете файлы, которые заканчиваются на index.html
, например/something/foo_index.html
, как это будет перенаправлено на /something/foo_
. Если это так, то вам нужно будет изменить регулярное выражение в приведенном выше RewriteRule
на что-то вроде ^(|.+/)index\.html$
вместо этого. Например:
# Remove "index.html" (whole path segment only)
RewriteRule ^(|.+/)index\.html$ /$1 [R=301,L]
Это будет соответствовать /index.html
и /something/index.html
, но не /something/foo_index.html
.
^(|.+/)
соответствует либо , либо ничего (т.Е. корень документа) или что-то , за которым следует косая черта (т. Е. подкаталог).
Сначала вы должны протестировать 302 (временное) перенаправление в чтобы избежать потенциальных проблем с кэшированием и переходить на 301 (постоянный) редирект только тогда, когда вы уверены, что все работает нормально.
Дополнительные:
Избегайте цикла перенаправления при перезаписи в index.html
(шаблон фронт-контроллера)
Вышеизложенного недостаточно, если вы используете шаблон фронт-контроллера для внутренней перезаписи запросов на index.html
(в данном случае это не так), поскольку вышеизложенное также перенаправит переписанный запрос на index.html
и вызовет цикл перенаправления.
В этом случае вам потребуется добавить дополнительное условие (RewriteCond
директива), которая гарантирует, что перенаправляются только прямые запросы (пользователем), а не переписанные запросы вашим сценарием/директивами.
Вы можете сделать это, либо сверившись с THE_REQUEST
(который содержит первую строку заголовков запроса и не изменяется при перезаписи запроса), либо с переменной среды REDIRECT_STATUS
(которая является пустой в исходном запросе и установите значение "200" - как в HTTP-ответе 200 OK - после первой успешной перезаписи).
Например:
# Remove "index.html" on direct requests only
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+/)?index\.html$ /$1 [R=301,L]