Как удалить вложенную папку из моих URL-адресов?

#.htaccess

Вопрос:

Есть несколько вопросов по этому поводу, но ни один из ответов, похоже, не работает для меня.

Как мне отредактировать свой .htacess файл, чтобы перейти от этого: https://www.website.com/removethis/keepthis.html

К этому: https://www.website.com/keepthis

Я успешно удалил .html часть со следующими строками:

 RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.] ).html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]
 

Это удаление вложенной папки, которая, похоже, не работает. Я пытался разобраться в доступной документации, но я довольно новичок в этом. Если это имеет значение, мой веб-сайт размещен на Namecheap (cPanel). Любая помощь будет очень признательна!

Комментарии:

1. Я должен добавить, что следующий код работал, но оказался index.html в каталог.. итак, если есть способ применить это правило ко всему, КРОМЕ index.html, это может сработать.. RewriteEngine On RewriteRule ^$ sub/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ sub/$1

Ответ №1:

Попробуйте сделать что-то вроде следующего в корневом .htaccess файле. Обратите внимание, что вы, должно быть, уже ссылаетесь на канонические URL — адреса в своем HTML-источнике (см. Ниже*1) — похоже, что это не так?

 Options -MultiViews
DirectoryIndex index.html

RewriteEngine On

# Redirect "/removethis/index.html" to "/"
# - Only direct requests should be redirected
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^removethis/(.*/)?index.html$ /$1 [R=302,L]

# Redirect "/removethis/keepthis.html" to "/keepthis"
# - Only direct requests should be redirected
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^removethis/(.*/)?([^/.] ).html$ /$1 [R=302,L]

# Rewrite "/" to "/removethis/"
# Or "/foo/bar/baz/" to "/removethis/foo/bar/baz/"
# - Only if the target directory exists
RewriteRule %{DOCUMENT_ROOT}/removethis/$1 -d
RewriteRule ^(|[^.] /)$ removethis/$1 [L]

# Rewrite "/keepthis" to "/removethis/keepthis.html"
# - Only if the target file exists
RewriteRule %{DOCUMENT_ROOT}/removethis/$1.html -f
RewriteRule ^([^.] )$ removethis/$1.html [L]
 

Это обрабатывает расширение .html файла и скрытый подкаталог (т. е. /removethis ) в единой директиве.

Перенаправления для удаления подкаталога ( /removethis ) и .html расширения файла должны обрабатываться только по прямым запросам, а не по переписанным запросам при последующей перезаписи (в противном случае вы получите цикл перенаправления). Проверка по переменной REDIRECT_STATUS среды гарантирует это.

URL-путь может состоять из нескольких сегментов пути. например /foo/bar/baz , он внутренне переписывается . /removethis/foo/bar/baz.html И внешне перенаправлены в другом направлении. Особое внимание уделяется index.html ( DirectoryIndex документу).

*1 Вам необходимо убедиться, что вы уже ссылаетесь на канонические URL-адреса в своем HTML-источнике. Перенаправления здесь предназначены только для сохранения SEO, если вы изменяете существующую структуру URL-адресов.

Например, вы уже должны ссылаться на канонические URL-адреса формы:

  • / — корень документа (домашняя страница)
  • /keepthis — Файлы не заканчиваются косой чертой
  • /path/to/file — Файлы не заканчиваются косой чертой
  • /path/to/dir/ — Каталоги заканчиваются косой чертой

И не:

  • /removethis/index.html — корень документа (домашняя страница)
  • /removethis/keepthis.html
  • /removethis/path/to/file.html
  • /removethis/path/to/dir/index.html

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