Установлен Apache 1.3.42 + PHP 5.3.5 + Drupal 6.20 с "чистыми ссылками", на всём этом с помощью мультисайтинга работает несколько сайтов. Соответственно, на каждом сайте полный URL к картинкам и файлам выглядик как http://www.domain.tld/sites/domain.tld/files/filename.ext, что вполне работоспособно, но чисто эстетически выглядит несколько длинновато.
Собственно, вопрос: можно ли с помощью настроек Друпала или mod_rewrite Апача сократить этот URL, избавившись от части так, чтобы для каждого сайта URL выглядел как http://www.domain.tld/files/filename.ext?
Комментарии
Простейший способ при использовании публичного метода доступа к файлам — путём изменения каталога для хранения файлов (переменная
file_directory_path
) вынести файлы изsites/domain.tld/files
вf1
,f2
, …, но для каждого сайта придётся сделать отдельный каталог, имя которого будет присутствовать в URL (при использовании публичного метода в Drupal 6 нет возможности менять генерируемый для файлов URL — см. реализациюfile_create_url()
). Файлы придётся перемещать физически в указанное место, при этом для уже загруженных ранее файлов придётся править пути в базе.Если же допустимо использовать приватный метод доступа к файлам, при формировании URL для файлов
file_create_url()
будет вызывать стандартную функциюurl()
, и используемые в этом режиме путиsystem/files/...
можно будет преобразовать во что-то другое черезcustom_url_rewrite_outbound()
— вот тут можно сделать и одинаковое имяfiles
для каждого сайта (а при обработке таких запросов можно, несмотря на выбор приватного метода доступа, отдавать какие-то файлы непосредственно веб-сервером для повышения производительности). Однако с приватным методом доступа в Drupal 6 куча проблем, которые в некоторых местах «починены» путём отключения неработающей части функций при включении этого режима.VSU, спасибо за такой подробный и развёрнутый ответ, особенно - за ссылки на конкретные функции, многое стало ясно из их кода.
Меня смущает только одно: судя по коду conf_path(), если она не может найти каталог для конкретного сайта, она возвращает строку 'sites/default', к которой file_directory_path() добавляет строку '/files'. Следовательно, для инсталляции Друпала с одним сайтом путь к его файлам должен содержать 'sites/default/files', хотя я помню, что в таком случае у меня получался URL вида 'www.domain.tld/files/filename.ext', то есть - без 'sites/default'. На многих других сайтах на Друпале также файлы доступны по URL без 'sites/<что-то-там>'. Я просто хочу понять - какие условия являются необходимыми и достаточными для создания таких "коротких" URL? Возможно, потом получится добиться такого же поведения и на мультисайтинге.
Да, значение по умолчанию именно такое — но если в настройках файловой системы указать другой путь к файлам,
file_directory_path()
вернёт указанный там путь, ничего к нему не добавляя; именно таким способом можно получить путь 'files'. Неудобство только в том, что при стандартной реализации мультисайтинга (когда для всех доменов назначается одинаковый DocumentRoot) придётся придумывать для разных сайтов разные имена для этого каталога.Но можно попробовать реализовать мультисайтинг и немного другим способом — сделать для каждого домена собственный DocumentRoot, куда поместить симлинки на общую копию файлов и каталогов Drupal, а каталог files оставить в каждом DocumentRoot индивидуальный. Правда, в этом случае потребуется разрешение на использование симлинков (без которого при стандартном способе можно обойтись).
Так и сделал, тем более, что "Options +FollowSymLinks" уже есть в стандартном .htaccess Друпала. Ещё раз спасибо за совет!
Для тех, кто вдруг сюда заглянет: для этой проблемы есть ещё одно решение, модуль file_aliases.
RedRat, спасибо за подсказку с модулем! Хотел получать ссылки на файлы с использованием алиасов (aliases), что б избавится от стандартных типа "/sites/default/files/", но пилить самому функционал оказалось сложнее чем я думал.
ПС. Те кто хочет установить модуль на Drupal 7, пользуйтесь версией 7.x-1.x-dev, она работает нормально. Рекомендованная версия имеет кучу багов.