我所在的大学计划为需要 Drupal 网站的员工/教职员工提供 Drupal 托管服务。我们已经设置了 Drupal 多站点,网址干净,除了一些奇怪的重定向外,它基本可以正常工作。如果您有两个站点,其中一个是另一个的子字符串,那么您将被随机重定向到另一个站点。我跟踪了这个问题,发现 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 重写,但这似乎也不是最理想的,因为它会在服务器上产生更高的负载,而服务器旨在托管大学的大部分面向外部的 Web 内容。
我可以用 mod_rewrite 做一些神奇的事情来让它工作吗? 还有其他更好的解决方案吗? 我一开始就做错了吗?
答案1
这似乎有效:
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]
感谢所有看过它的人。