Перенаправление субдомена в папку внутри основного, содержащую приложение CakePHP

Попробовал много примеров здесь, в SO, но ни один из них не работает. Подумайте о моей настройке:

/public_html/
     /app/
     /cgi-bin/
     /lib/
     /plugins/
     /revamp/
     /vendors/

В настоящее время у меня есть сайт cakephp site.com, который имеет свои файлы в папке /app/, а используемый мной .htaccess теперь выглядит следующим образом:

<IfModule mod_rewrite.c>  
  RewriteEngine on

  ReWriteRule ^$ app/webroot/ [L]
  ReWriteRule (.*) app/webroot/$1 [L]
</IfModule>

Я хочу перенаправить субдомен revamp.site.com в папку /revamp/, которая будет другим сайтом cakephp.

ОБНОВЛЕНИЕ 1:

Было предложено создать vhost, и я это сделал, он установлен в папку поддомена, помощь, которую я хочу, - это правило htaccess для работы как для одного, так и для него, а также для перенаправления на субдомен, если запрашиваемый адрес имеет поддомен на нем перед доменом...

ОБНОВЛЕНИЕ 2:

Следующий .htaccess возвращает меня к моему поддомену, но только к index.html

<IfModule mod_rewrite.c>
   RewriteEngine on

    RewriteCond %{HTTP_HOST} ^site\.com$
    RewriteRule    (.*) app/webroot/$1 [L]

    RewriteCond %{HTTP_HOST} ^revamp\.site\.com$
    RewriteRule (.*) revamp/index.html [L]
</IfModule>

Это сочетание двух ответов... хотя любой путь, который я поставил с субдоменом, он только заставит меня проиндексировать index.html(поскольку он жестко закодирован в htaccess). Пробовал также revamp/$ и revamp/$1 без везения.

ОБНОВЛЕНИЕ 3:

Пробовал это с правлением первого ответа:

<IfModule mod_rewrite.c>
   RewriteEngine on

   #subdomain simple site
   RewriteCond %{HTTP_HOST} ^subdomain\.test\.com$
   RewriteCond %{REQUEST_URI} !^/subdomain
   RewriteRule    ^(.*)$ subdomain/$1 [L]

   #cakephp site
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

Все еще дает 500, я также попытался переключить позиции обоих блоков

Обновление 4:

РЕШЕНИЕ РАБОТЫ, имеющее оба сайта cakephp под /public_html/app и /public_html/revamp/app

<IfModule mod_rewrite.c>
   RewriteEngine on

   RewriteCond %{HTTP_HOST} ^revamp\.site\.com$
   RewriteRule    ^(.*)$ revamp/app/webroot/$1 [NC,L]

   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [NC,L]
</IfModule>

Ответ 1

Вы можете выполнить требуемую переписывание, используя "Условие перезаписи" для разных доменов:

На моей машине я создал структуру папок, например

public_html
 -app
   -webroot
 -local
   -app
     -webroot

webroot и локальный каталог в папке public_html, а затем каталог приложений и webroot в локальной папке.

Теперь я создал запись виртуального хоста, как показано ниже:

<VirtualHost test.com:80>
 ServerName test.com
 ServerAlias local.test.com
 DocumentRoot /var/www/html/public_html

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Значит test.com и local.test.com оба указателя в каталоге public_html.

Теперь ваша цель: если домен test.com, то внешнее приложение должно запускаться, а если домен local.test.com, то ваше внутреннее (локальное) приложение должно запускаться.

В качестве структуры .htaccess в cakephp я разместил файл .htaccess в обеих папках app и webroot обоих приложений.

код .htaccess в каталоге app/

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$    webroot/    [L]
   RewriteRule    (.*) webroot/$1    [L]
</IfModule>

код .htaccess в webroot/

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

теперь изменения в .htaccess корневого каталога, т.е. public_html:

<IfModule mod_rewrite.c>
   RewriteEngine on
   #for test.com
   RewriteCond %{HTTP_HOST} ^test\.com$
   RewriteRule    ^(.*)$ app/webroot/$1 [NC,L]

   #for local.test.com
   RewriteCond %{HTTP_HOST} ^local\.test\.com$
   RewriteRule    ^(.*)$ local/app/webroot/$1 [NC,L]
</IfModule>
  • RewriteCond %{HTTP_HOST} ^test\.com$ определит, что домен test.com
  • RewriteCond %{HTTP_HOST} ^local\.test\.com$ определит, что домен local.test.com

Для общей перезаписи поддоменов вы можете использовать следующий код:

Структура папки:

public_html
 -index.html
 -subdomain
  --index.html

Код .htaccess

<IfModule mod_rewrite.c>
   RewriteEngine on

   #for subdomain.test.com
   RewriteCond %{HTTP_HOST} ^subdomain\.test\.com$
   RewriteCond %{REQUEST_URI} !^/subdomain
   RewriteRule    ^(.*)$ subdomain/$1 [L]
</IfModule>

теперь test.com откроет index.html папки public_html, а subdomain.test.com откроет index.html папки subdomain

Обновить ответ 2

Я создал точную структуру каталогов, о которой идет речь, и ниже код htaccess работает для меня:

<IfModule mod_rewrite.c>
   RewriteEngine on

   RewriteCond %{HTTP_HOST} ^test\.com$
   RewriteRule    ^(.*)$ app/webroot/$1 [NC,L]

  RewriteCond %{HTTP_HOST} ^revamp\.test\.com$
  RewriteCond %{REQUEST_URI} !^/revamp
  RewriteRule    ^(.*)$ revamp/$1 [NC,L]
</IfModule>

Ответ 2

Try

RewriteCond %{HTTP_HOST} ^revamp\.site\.com$
RewriteRule (.*) revamp.site.com/$1 [R=301,L]
RewriteRule ^$ revamp [L]

Однако я бы создал тривиальный новый VirtualHost для обработки запросов к субдомену

<VirtualHost *:80>
    ServerName revamp.site.com
    DocumentRoot /path/to/public_html/revamp
    <Directory>
        #your other rewrite rules here
    </Directory>
</VirtualHost>

Литература: