Перенаправление с 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, как указано выше?

Author: MrWhite, 2021-02-07

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]
 4
Author: MrWhite, 2021-02-09 00:08:11