. Я пытаюсь перенаправить / перезаписать .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, который начинается /сайт1
, /сайт2
или /сайт3
(обратите внимание, что в .htaccess
шаблон исключает префикс коса продольного сечения). И затем внутренне переписывает запрос с /сайта1/<всегда>
на /сайт1/публичный/<всегда>
, используя $1
и /сайт2
обратные ссылки. Дополнительный слэш в шаблоне RewriteRule
pattern гарантирует, что он также будет совпадать с запросом на голый подкаталог, исключая трейлинговый слэш, т.е. /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
/контексте каталога (как упоминалось выше).