Перенаправить все голые подпапки в 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]
1
задан 6 August 2017 в 11:25
1 ответ

Попробуйте вместо этого что-нибудь подобное в вашем корневом файле .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/контексте каталога (как упоминалось выше).
  • Вы не захватываете остальную часть пути URL, так что это приведет только к перезаписи в корень документа, независимо от того, какой URL был запрошен.
  • Это приведет к перезаписыванию цикла. (Это приводит к ошибке 500 внутреннего сервера.)
2
ответ дан 3 December 2019 в 20:20

Теги

Похожие вопросы