Mod-Rewrite

用 mod_rewrite 模擬 VirtualDocumentRoot

  • July 16, 2012

在我的 apache 設置中,我希望有多個以域名命名的目錄,這些目錄將基於子域層次結構提供服務。

例如,給定兩個目錄:

  1. company.com
  2. shop.company.com

Apache 將根據請求主機提供以下目錄:

  1. www.company.com -> company.com
  2. us.company.com -> company.com
  3. shop.company.com -> shop.company.com
  4. foo.bar.shop.company.com -> shop.company.com

據我所知,mod_vhost_alias 無法測試目錄的存在或操作請求主機。因此它不適合該任務。

然而,我成功完成了以下 mod_rewrite 實現:

<VirtualHost *:80>
   # Omitting this line produces strange behaviour, requesting company.com the
   # server will try to look up /var/www/test.localhost/var/www/test.localhost
   # Clarification on this issue is very welcome
   DocumentRoot /var/www

   RewriteEngine on

   # Full domain
   RewriteCond %{HTTP_HOST} ^(.*)$
   RewriteCond /var/www/%1 -d
   RewriteRule (.*) /var/www/%1/$1 [L]

   # -1 domain level
   RewriteCond %{HTTP_HOST} ^.+?\.(.*)$
   RewriteCond /var/www/%1 -d
   RewriteRule (.*) /var/www/%1/$1 [L]
</VirtualHost>

我想知道這個任務是否有更好的解決方案,以及我的實現是否有任何陷阱。

到目前為止,我只發現我需要為依賴重寫並應該放在頂層的腳本指定“RewriteBase /”。

這不適用於生產,性能影響可以忽略不計。

我會說這是一個非常聰明的方法。明顯的缺陷是它不適用於您的第四個範例-您只剝離了第一個子域部分,因此foo.bar.shop.company.com將被翻譯為bar.shop.company.com而不是 shop.company .com

您可以使用外部程序(例如 perl 腳本)進行重寫,通過使用 RewriteMap 指令來擷取更特殊的情況。這將帶來更多的複雜性並進一步降低性能。

引用自:https://serverfault.com/questions/407863