Как сопоставить три сайта в одном домене с их папками только с помощью 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) в браузер клиента.