Скрыть подпапку из URL-адреса сайта с помощью .htaccess

#.htaccess #url

Вопрос:

У меня есть такой URL-адрес www.example.com/subfolder/index1 , и я хочу добиться следующего результата www.example.com/index1 (см. Ниже, у меня только 2 вложенные папки, я должен сделать то же самое для обеих).

Папка, которая у меня есть в моем проекте, выглядит следующим образом:

 index.html (main page) subfolder1 -gt; index1.html subfolder2 -gt; index2.html  

До сих пор у меня в файле htaccess есть следующий код:

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

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

1. Какие еще у вас есть указания? Есть еще какие-нибудь .htaccess файлы? Если вышесказанное-это все, что у вас есть, то вы получите 500 внутренних ошибок сервера (из-за цикла перезаписи). «Я получаю 404 на главной странице» — Какой URL вы запрашиваете? Какой файл вы ожидаете получить?

2. @MrWhite Я обновил свой вопрос относительно вашего ответа. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация. Спасибо!

3. И «обновленный» .htaccess файл, который вы опубликовали, находится в корне документа, я полагаю, а не внутри /subfolder1 и т. Д.?

4. Точно, это код, который у меня сейчас работает (я хотел удалить .html в конце файла).

5. Почему вы хотите использовать rewrite? Я бы просто переехал index1.html в его родительский каталог, и у меня вообще не было вложенных папок.

Ответ №1:

Имея два «скрытых» подкаталога ( /subfolder1 и /subfolder2 ), вы создали двусмысленность. например. Куда следует направить запрос на /foo переписывание? Должно ли это быть /subfolder1/foo.html или /subfolder2/foo.html ? Единственный способ определить это-сначала проверить , существует ли файл, в /subfolder1 противном случае перепишите /subfolder2 его .

Вы также, похоже, используете .html URL-адреса без расширения. И вы, похоже, ссылаетесь на файлы за пределами этих двух вложенных папок.

Попробуйте что-то вроде следующего:

 DirectoryIndex index.html  RewriteEngine On  # Redirect any direct requests for "/subfolder1" or "/subfolder2" back to the root # - Except for "assets" RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_URI} !^/[^/] /assets/ RewriteRule ^(?:subfolder1|subfolder2)(?:$|/(.*)) /$1 [R=301,L]  # Remove "index.html" entirely if requested RewriteRule (^|. /)index.html$ /$1 [R=301,L]  # Remove ".html" extension if requested directly RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^([^.] ).html$ /$1 [R=301,L]  # Rewrite requests to subfolder1 if ".html" file exists in that subdir RewriteCond %{DOCUMENT_ROOT}/subfolder1/$1.html -f RewriteRule ^([^.] )$ subfolder1/$1.html [L]  # Rewrite requests to subfolder2 if ".html" file exists in that subdir RewriteCond %{DOCUMENT_ROOT}/subfolder2/$1.html -f RewriteRule ^([^.] )$ subfolder2/$1.html [L]  # Otherwise append ".html" if the file exists # - Only required if you are serving other HTML files outside of the subfolders  # - (Excluding "/index.html" in the document root) RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^([^.] )$ $1.html [L]  

Несколько предположений:

  • ваши статические ресурсы (изображения, CSS, JS и т.д.) Запрашиваются напрямую и включают /subfolder1 или /subfolder2 содержат URL-адрес. В противном случае становится проблематичным разрешить все двусмысленности между /subfolder1 и /subfolder2 . Однако это означает /subfolder1 , что (или /subfolder2 ) на самом деле не «скрыто».
  • Ваши URL-адреса без расширения не содержат точки (которая в противном случае ограничивает расширение файла).

ПРИМЕЧАНИЕ: Протестируйте с 302 (временными) перенаправлениями, чтобы избежать потенциальных проблем с кэшированием.