Mod-Rewrite
用 mod_rewrite 模擬 VirtualDocumentRoot
在我的 apache 設置中,我希望有多個以域名命名的目錄,這些目錄將基於子域層次結構提供服務。
例如,給定兩個目錄:
- company.com
- shop.company.com
Apache 將根據請求主機提供以下目錄:
- www.company.com -> company.com
- us.company.com -> company.com
- shop.company.com -> shop.company.com
- 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 指令來擷取更特殊的情況。這將帶來更多的複雜性並進一步降低性能。