Отправлено: 02.01.2006 02:02
Пусть у нас есть FTP сайт:
ftp://ftp.server.com с корневым каталогом в /var/ftp
И стоит задача создать WWW интерфейс к этому сайту:
http://ftp.server.com с корневым каталогом в /var/www/ftp.server.com
Другими словами - корень WWW сайта не должен смотреть в корень FTP сайта. Это значит, что файлы, расположенные на FTP сайте, мы должны отдавать через симлинки, лежащие на WWW сайте.
Для чего такое может понадобиться. Допустим - мы хотим организовать Mp3 архив, при этом часть файлов будет доступна только через WWW. Кроме того так можно гибко разграничивать доступ к WWW и FTP сайтам.
Возникает необходимость автоматизировать создание таких симлинков после обновления FTP сайта. При этом, кроме создания самих симлинков, так же нужно создавать для них каталоги и производить очистку WWW сайта, как от пустых каталогов, так и от симлинков, ведущих в никуда.
В результате был написан небольшой скрипт, запускаемый после обновления FTP сайта и выполняющий все необходимые операции:
#!/bin/sh
# Находим симлинки, ведущие в никуда, и удаляем их:
find -L /var/www/ftp.server.com/ -type l -exec rm -f {} \;
# Находим получившиеся пустые каталоги и удаляем их:
find /var/www/ftp.server.com/ -type d -empty -delete
# Рекурсивно находим все файлы, лежащие в корневом
# каталоге FTP сервера:
for i in `find /var/ftp/ -type f`; do
# Для каждого из этих файлов получаем путь для симлинка,
# указывающего на этот файл, при этом происходит замена
# пути "ftp" на "www/ftp.server.com":
link=`echo $i | sed -e 's/ftp/www\/ftp\.serever\.com/g'`
# Если каталог, в котором нужно создать симлинк,
# ещё не существует,
if [ ! -d `dirname $link` ]; then
# то - создаём его:
mkdir -p `dirname $link`
fi
# Если нужный симлинк ещё не существует,
if [ ! -L $link ]; then
# то - создаём его:
ln -s $i $link
fi
done
Хочется лишь добавить, что для того, чтобы Apache следовал по прописанным симлинкам, в свойствах VirtualHost должна быть прописана директива:
Options FollowSymlinks