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

如何使用 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 直接为文件提供服务。

有任何想法吗?

答案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...

相关内容