目录结构中有一些文件(具有唯一名称),如下所示:
/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 直接为文件提供服务。
有任何想法吗?
答案1
您可以创建一个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
来自 的请求/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...