#.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 (временными) перенаправлениями, чтобы избежать потенциальных проблем с кэшированием.