Apache-2.4

如何使用 apache 和(也許)mod_rewrite 提供不同的內容

  • December 7, 2017

在這樣的目錄結構中有一些文件(具有唯一名稱):

/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_filename2to重寫/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...

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