Я пытаюсь сделать .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
/ контекст каталога (как указано выше).