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

Приключения в мультисайтовой конфигурации Drupal с mod_rewrite и чистыми URL

Университет, в котором я работаю, планирует предложить хостинг Drupal сотрудникам / преподавателям, которым нужен сайт Drupal. Мы настроили мультисайт Drupal с чистыми URL-адресами, и он в основном работает, за исключением некоторых странных перенаправлений. Если у вас есть два сайта, один из которых является подстрокой другого, вы будете случайным образом перенаправлены на другой сайт. Я отследил проблему того, как mod_rewrite выполняет сопоставление пути, поэтому с помощью такого файла конфигурации:

RewriteCond %{REQUEST_URI} ^/drupal
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /drupal/index.php?q=$1 [last,qsappend]

RewriteCond %{REQUEST_URI} ^/drupaltest
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /drupaltest/index.php?q=$1 [last,qsappend]

/ drupaltest будет соответствовать строке / drupal, и все ссылки на странице / drupaltest будут переписаны, чтобы указывать на / drupal.

Если вы поместите конец строкового символа ($) в конце каждого условия перезаписи, тогда он всегда будет соответствовать на правильном сайте, и ссылки всегда будут переписываться правильно. Это перестает работать, как только пользователь входит в систему, потому что строка запроса добавляется к URL-адресу, поэтому просто базовый URL-адрес больше не будет совпадать.

Вы также можете решить проблему, упорядочив сайты в файле конфигурации, чтобы самая маленькая подстрока всегда была последней. Я предложил хранить все сайты в таблице, а затем запрашивать, сортировать и переписывать файл конфигурации каждый раз, когда запрашивается сайт Drupal, чтобы мы могли гарантировать порядок. Системный администратор подумал, что это глупо, и не решил основную проблему.

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

Есть ли какое-то волшебство, которое я могу сделать с mod_rewrite, чтобы заставить его работать? Было бы лучше другое решение? Я что-то делаю неправильно с самого начала?

Кажется, это работает:

RewriteCond %{REQUEST_URI}/ ^/drupal/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /drupal/index.php?q=$1 [last,qsappend]

RewriteCond %{REQUEST_URI}/ ^/drupaltest/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /drupaltest/index.php?q=$1 [last,qsappend]

Спасибо всем, кто посмотрел.