Назад | Перейти на главную страницу

Перенаправить все голые подпапки в subfoldername / public /

Я пытаюсь сделать .htaccess перенаправить / перезаписать все подпапки верхнего уровня в подпапку.

Например, моя структура каталогов выглядит так

/public_html

  /site1
    /public 

  /site2
    /public

  /site3
    /public

Я бы хотел, чтобы кто-нибудь example.com/site1/ подавать файлы из example.com/site1/public, но я не хочу, чтобы URL-адрес отображал public.

Вот что я пробовал:

RewriteEngine On
#RewriteRule /(.?)/ /$1/public/ [L]

Вместо этого попробуйте в корне что-то вроде следующего .htaccess файл:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(site1|site2|site3)/?(.*) /$1/public/$2 [L]

Это нацелено на любой URL, который начинается /site1, /site2 или /site3 (обратите внимание, что в .htaccess шаблон исключает префикс косой черты). А затем внутренне переписывает запрос из /site1/<whatever> к /site1/public/<whatever> используя $1 и $2 обратные ссылки. Необязательная косая черта в RewriteRule шаблон гарантирует, что он также будет соответствовать запросу для пустого подкаталога, за исключением завершающей косой черты, т.е. /site1вместо того, чтобы позволить mod_dir сначала выполнить перенаправление на /site1/.

Переписать любой корневой каталог (не только ограничиваясь site1, site2и т. д.), затем измените RewriteRule директива читать:

RewriteRule ^([^/]+)/?(.*) /$1/public/$2 [L]

Регулярное выражение [^/]+ соответствует только первому сегменту пути, т.е. все, кроме первой косой черты.

В RewriteCond директива, которая проверяет соответствие REDIRECT_STATUS переменная окружения гарантирует, что мы не получим цикл перезаписи. REDIRECT_STATUS не устанавливается при первом вызове сценария, но устанавливается в состояние HTTP при первой перезаписи (или в состоянии ошибки).

#RewriteRule /(.?)/ /$1/public/ [L]

Несколько проблем с вашей исходной директивой ...

  • .? захватывает только один символ, который вы сделали необязательным.
  • /(.?)/ будет соответствовать везде в запрошенном URL (не в начале). Но обратите внимание, что вы не можете сопоставить первую косую черту в начале URL-пути в .htaccess/ контекст каталога (как указано выше).
  • Вы не захватываете остальную часть URL-пути, поэтому это будет перезаписано только в корень документа, независимо от того, какой URL был запрошен.
  • Это вызовет цикл перезаписи. (В результате произошла внутренняя ошибка сервера 500.)