[Решено] Можно ли сократить длину URL при мультсайтинге?

Главные вкладки

Аватар пользователя RedRat RedRat 22 февраля 2011 в 16:29

Установлен 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?

Комментарии

Аватар пользователя vsu@drupal.org vsu@drupal.org 22 февраля 2011 в 23:26

Простейший способ при использовании публичного метода доступа к файлам — путём изменения каталога для хранения файлов (переменная 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 куча проблем, которые в некоторых местах «починены» путём отключения неработающей части функций при включении этого режима.

Аватар пользователя RedRat RedRat 23 февраля 2011 в 12:24

VSU, спасибо за такой подробный и развёрнутый ответ, особенно - за ссылки на конкретные функции, многое стало ясно из их кода.

Меня смущает только одно: судя по коду conf_path(), если она не может найти каталог для конкретного сайта, она возвращает строку 'sites/default', к которой file_directory_path() добавляет строку '/files'. Следовательно, для инсталляции Друпала с одним сайтом путь к его файлам должен содержать 'sites/default/files', хотя я помню, что в таком случае у меня получался URL вида 'www.domain.tld/files/filename.ext', то есть - без 'sites/default'. На многих других сайтах на Друпале также файлы доступны по URL без 'sites/<что-то-там>'. Я просто хочу понять - какие условия являются необходимыми и достаточными для создания таких "коротких" URL? Возможно, потом получится добиться такого же поведения и на мультисайтинге.

Аватар пользователя vsu@drupal.org vsu@drupal.org 25 февраля 2011 в 21:33

"RedRat" wrote:
Меня смущает только одно: судя по коду conf_path(), если она не может найти каталог для конкретного сайта, она возвращает строку 'sites/default', к которой file_directory_path() добавляет строку '/files'.

Да, значение по умолчанию именно такое — но если в настройках файловой системы указать другой путь к файлам, file_directory_path() вернёт указанный там путь, ничего к нему не добавляя; именно таким способом можно получить путь 'files'. Неудобство только в том, что при стандартной реализации мультисайтинга (когда для всех доменов назначается одинаковый DocumentRoot) придётся придумывать для разных сайтов разные имена для этого каталога.

Но можно попробовать реализовать мультисайтинг и немного другим способом — сделать для каждого домена собственный DocumentRoot, куда поместить симлинки на общую копию файлов и каталогов Drupal, а каталог files оставить в каждом DocumentRoot индивидуальный. Правда, в этом случае потребуется разрешение на использование симлинков (без которого при стандартном способе можно обойтись).

Аватар пользователя RedRat RedRat 3 марта 2011 в 14:27

"<a href="mailto:vsu@drupal.org">vsu@drupal.org</a>" wrote:
Но можно попробовать реализовать мультисайтинг и немного другим способом — сделать для каждого домена собственный DocumentRoot, куда поместить симлинки на общую копию файлов и каталогов Drupal, а каталог files оставить в каждом DocumentRoot индивидуальный. Правда, в этом случае потребуется разрешение на использование симлинков (без которого при стандартном способе можно обойтись).

Так и сделал, тем более, что "Options +FollowSymLinks" уже есть в стандартном .htaccess Друпала. Ещё раз спасибо за совет!

Аватар пользователя animan animan 5 ноября 2015 в 20:58

RedRat, спасибо за подсказку с модулем! Хотел получать ссылки на файлы с использованием алиасов (aliases), что б избавится от стандартных типа "/sites/default/files/", но пилить самому функционал оказалось сложнее чем я думал.

ПС. Те кто хочет установить модуль на Drupal 7, пользуйтесь версией 7.x-1.x-dev, она работает нормально. Рекомендованная версия имеет кучу багов.