Как сопоставить три сайта в одном домене с их папками только с помощью mod_rewrite?

У меня есть проект, который имеет заставку, которая указывает на два отдельных сайта. Сайты размещены на одном сервере, и они должны быть в отдельных папках для лучшего обслуживания.

Структура папок должна выглядеть примерно так:

/home/user1234/public_html

    /splash/
        index.html
        css/
        images/
        ...

    /site1/
        index.php
        css/
        images/
        ...

    /site2/
        index.php
        css/
        images/
        ...

Основные сайты (site1 и site2, вероятно, две установки Wordpress) должны быть доступны в подкаталоге, таком как структура url, а не в поддоменах! Таким образом, структура URL должна быть:

www.MySite.tld --> Splash
www.MySite.tld/site1 --> Site1
www.MySite.tld/site2 --> Site2

Теперь я должен сопоставить эти URL с соответствующим каталогом на сервере. Но я не знаю точно, как это сделать. Я должен сказать, что это общий хостинг-сервер, поэтому я могу использовать только htaccess и mod_rewrite для этого, верно?

Итак, в интерфейсе администратора веб-хоста я указал www.MySite.tld на папку /splash. Затем я помещаю.htaccess в эту папку и переписываю запросы в "виртуальные папки" /site1 и /site2, примерно так:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/(site1|site2)/?$ [NC]

RewriteRule ^(.*)$ /home/user1234/public_html/%1 [L]

Это не работает, потому что, насколько я знаю, невозможно переписать файлы вне текущего DOCUMENT_ROOT (/splash) только с mod_rewrite. Поэтому я попытался указать www.MySite.tld на один уровень выше /public_html вместо /splash. Теперь запросы к / site1 и / site2 работают точно, но запрос к / возвращает 404 по умолчанию, потому что там нет индексного файла, как вы можете видеть в структуре папок выше. Поэтому я также поднял.htaccess на один уровень вверх в /public_html со следующими правилами:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/?$ [NC]

RewriteRule ^(.*)$ /splash [L]

Теперь страница-заставка доступна, но в конце URL добавляется "/splash", чего я не хочу!

Я искал решение в течение многих часов и перепробовал многие предложения, которые нашел до сих пор, но ни одно из них не решило мою проблему. Последнее, что я попробовал, было настроить какой-нибудь виртуальный хост с mod_rewrite, но я не мог заставить это работать тоже. Вероятно, я просто еще недостаточно подтверждаю с mod_rewrite и всем этим прочим Apache.;-)

Или, может быть, я упускаю просто что-то фундаментальное, например, установку правильного RewriteBase... Может ли эта структура папок url ​​+ быть реализована только с помощью mod_rewrite? Если да, какие правила перезаписи я должен установить? Если нет, есть ли альтернативы, которые я могу использовать? Любая помощь будет принята с благодарностью.

1 ответ

Решение

Вы можете довольно легко сделать это с помощью mod_rewrite. Учитывая указанную вами структуру URL, используйте следующий.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(site1|site2|splash)/ [NC]
RewriteRule ^(.*) splash/$1 [L,PT]

RewriteCond будет избегать перезаписей при запросе site1 или site2, а также предотвращает бесконечные циклы при запросах к /splash (это особенно важно при реализации.htaccess).

Если RewriteCond это совпадение (т.е. запрос не для любого из трех путей) RewriteRule сопоставляется со всеми URL ^(.*) и переписан как splash/$1, Варианты L,PT определить, что это должно быть L|last правило (полезно в контексте VirtualHost, не всегда работает в.htaccess) и что запрос должен PT|passthrough в бэкэнд (в данном случае Apache, опять же), без отправки заголовка перенаправления (30x) в браузер клиента.

Другие вопросы по тегам