Apache-2.4
如何使用 apache 和(也許)mod_rewrite 提供不同的內容
在這樣的目錄結構中有一些文件(具有唯一名稱):
/var/www/domain1/unique_filename1 /var/www/domain2/unique_filename2 /var/www/domain3/unique_filename3
目前,所有域目錄都可以作為主域的子目錄訪問,客戶端可以使用以下 URI 訪問文件:
www.my-master-domain.com/domain1/unique_filename1 www.my-master-domain.com/domain2/unique_filename2 www.my-master-domain.com/domain3/unique_filename3
我想修改 Apache 2.4 配置,以便我能夠訪問文件而無需在我的 URL 中提及輔助域,例如:
www.my-master-domain.com/unique_filename1 www.my-master-domain.com/unique_filename2 www.my-master-domain.com/unique_filename3
當然,在客戶端瀏覽器上進行任何重定向是不可取的(如果我想的話,在這種特殊情況下是不可能的),我只需要通過第二組提到的 URL 直接為文件提供服務。
有任何想法嗎?
您可以創建一個
RewriteMap
將“唯一”文件名映射到它所儲存的域。然後,您可以使用指令從請求的“唯一”文件名RewriteRule
中查找域並在**內部重寫請求。例如,在您的伺服器配置中,定義
RewriteMap
:RewriteMap fn2domain "txt:/var/www/filename-to-domain-map.txt"
然後,
/var/www/filename-to-domain-map.txt
您將包含所有文件名映射:# Filename to Domain map unique_filename1 domain1 unique_filename2 domain2 unique_filename3 domain3
現在您可以使用 mod_rewrite 來引用此映射,以便在內部將請求從
/unique_filename2
to重寫/domain2/unique_filename2
(例如)。RewriteEngine On RewriteRule ^/([^/]+)$ /${fn2domain:$1}/$1 [L]
這假設“unique_filename”正是如此;只是一個文件名。沒有額外的 URL 路徑。
dbm:
如果您有許多“文件名”,您可以通過使用DBM 雜湊文件(或fastdbd:
SQL 查詢?)而不是純文字文件來提高查找效率。參考:
https ://httpd.apache.org/docs/2.4/rewrite/rewritemap.html
或者,您可以對每個域子目錄中是否存在“unique_filename”執行文件系統檢查。第一場比賽獲勝。如果您只有 2 或 3 個域子目錄,這可能沒問題,但如果您有很多,那麼這可能會成為性能問題,因為文件系統檢查相對昂貴*。*例如,再次使用 mod_rewrite:
RewriteEngine On # Is it in domain1? Then rewrite to domain1 subdirectory RewriteRule %{DOCUMENT_ROOT}/domain1/$1 -f RewriteRule ^/([^/]+)$ /domain1/$1 [L] # Is it in domain2? Then rewrite to domain2 subdirectory RewriteRule %{DOCUMENT_ROOT}/domain2/$1 -f RewriteRule ^/([^/]+)$ /domain2/$1 [L] # Is it in domain3? Then rewrite to domain3 subdirectory RewriteRule %{DOCUMENT_ROOT}/domain3/$1 -f RewriteRule ^/([^/]+)$ /domain3/$1 [L] # Repeat for each domain...