Назад | Перейти на главную страницу

Совместное использование одного и того же корня документа - за исключением папки и файла

У меня два веб-сайта: веб-сайтa и веб-сайтb.

У меня они оба указывают на один и тот же корень документа, и все работает нормально, однако я хочу, чтобы на сайтеa были разные детали db для сайтаb.

Детали базы данных хранятся в /config/database.php

я мог просто напишите оператор if в этом php-файле, чтобы указать, какие детали базы данных использовать в зависимости от имени хоста, однако я собираюсь добавить еще 10 таких веб-сайтов, и это очень быстро вызовет боль.

Вторая проблема заключается в том, что у меня есть папка / images /, которая содержит загруженные пользователем изображения, они снова должны быть разными.

Когда я впервые подумал об этом, я подумал, что могу использовать псевдоним apache - однако это не будет работать с php, поскольку

<?php include('config/database.php');?>

не будет следовать псевдониму (не веб-запросу, это поиск в локальном каталоге) и, следовательно, потерпит неудачу.

Так что я немного застрял :)

У кого-нибудь есть мысли?

Просто используйте символические ссылки для всех файлов и каталогов в корневой папке сайта.

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

Один из вариантов, который вы можете использовать здесь, - это использовать Unionfs. Unionfs в основном предоставляет метод объединения двух файловых систем. Обратной стороной является то, что по умолчанию unionfs доступен не во всех системах. Возможно, вам придется перекомпилировать ядро.

По сути, вы можете настроить что-то вроде этого

/srv/www/basefolder (all the common files
/srv/www/localstuff/site1.example.org (files unique to a specific site)
/srv/www/localstuff/site2.example.org
/srv/www/localstuff/siten.example.org
/srv/www/unions/site1.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site1.example.org)
/srv/www/unions/site2.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site2.example.org)
/srv/www/unions/siten.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/siten.example.org)

Другой вариант - просто использовать жесткие ссылки. Настроить это довольно просто с помощью rsync. Обратной стороной этого является то, что вы нарушаете работу многих сайтов, если не обращаете на них внимания. Если вы забываете, что все жестко связали вместе, и вносите изменения в файлы в одном месте, это изменяется во всех местах. Вам также потребуется повторно запускать команду rsync всякий раз, когда вы обновляете файлы.

/srv/www/basefolder (all the common files
/srv/www/site1.example.org 
/srv/www/site2.example.org

Используйте подобные команды, чтобы построить эту структуру

rsync -vr /srv/www/basefolder /srv/www/site1.example.org --link-dest /srv/www/basefolder
rsync -vr /srv/www/basefolder /srv/www/site2.example.org --link-dest /srv/www/basefolder

Можно ли разместить весь общий контент в отдельном месте и создать множество корневых документов с разными конфигурационными файлами, папками изображений и символическими ссылками на общие каталоги данных? Вы даже можете создать сценарий bash для автоматического развертывания этой структуры.

Непонятно, что использует папку / images / и сколько у вас скриптов php.

Однако можно было бы переписать php для использования config / HTTP_HOST.database.php, чтобы он масштабировался по мере добавления виртуальных хостов. Если код php использует / images или создает ссылки на / images, его можно также переписать для использования HTTP_HOST (переданного из Apache). Если ссылки поступают из другого приложения, вы можете использовать правила перезаписи apache, чтобы поместить информацию о виртуальном хосте в запросы для / images /, чтобы получить каталоги, которые выглядят как / images /, но сопоставляются с уникальными вещами на диске.

Дополнительная информация о HTTP_HOST на php:

http://lab.artlung.com/echo-http-host/

Это решение устранит необходимость дублировать данные для каждого развертывания пользователя, но требует изменения кода и, возможно, переписывания правил в apache.