Университет, в котором я работаю, планирует предложить хостинг 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]
Спасибо всем, кто посмотрел.