0

我正在解决一个问题,我想根据传入的 Host 标头选择不同的静态内容文件。简单的示例是从 URL 到文件的映射,如下所示:

  • www.example.com/images/logo.gif -> \images\logo.gif
  • skin2.example.com/images/logo.gif -> \images\skin2\logo.gif
  • skin3.example.com/images/logo.gif -> \images\skin3\logo.gif

我使用以下 RewriteRules 进行此操作,但我不喜欢我必须如此重复自己。每个主机都有相同的规则集,每个RewriteCondRewriteRule都有相同的路径。我想使用RewriteMap,但我不知道如何使用它将 %{HTTP_HOST} 映射到路径。

<VirtualHost *:80>
    DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
    ServerName www.example.com
    ServerAlias skin2.example.com
    ServerAlias skin3.example.com

    RewriteEngine On

    RewriteCond %{HTTP_HOST} skin2.example.com
    RewriteCond %{DOCUMENT_ROOT}$1/skin2/$2 -f
    RewriteRule ^(.*)/(.*) $1/skin2/$2 [L]

    RewriteCond %{HTTP_HOST} skin3.example.com
    RewriteCond %{DOCUMENT_ROOT}$1/skin3/$2 -f
    RewriteRule ^(.*)/(.*) $1/skin3/$2 [L]
</VirtualHost>

规则背后的概念是,如果该主机的子目录中存在相同的文件名,则使用它而不是直接目标文件。这在最低级别使用基于主机的子目录,而不是使用顶级子目录来分隔内容。

更新: 我想修改问题以假设主机名与子目录不完全匹配,但确实以 1-1 映射的形式存在。这是修改后的 URL 到文件映射。

  • www.example.com/images/logo.gif -> \images\logo.gif
  • skin2.example.com/images/logo.gif -> \images\s2\logo.gif
  • skin3.example.com/images/logo.gif -> \images\s3\logo.gif

为了与RewriteMap一起使用,我创建了这个数据文件:

##  hostmap.txt -- hostname to subdirectory map
skin2.example.com    s2   # map skin2 to s2 directory
skin3.example.com    s3   # map skin2 to s3 directory

并将 RewriteRules 更改为直接在 map 调用中使用 %{HTTP_HOST} ,这似乎有效。

RewriteEngine On
RewriteMap hostmap txt:conf/hostmap.txt 
RewriteCond %{DOCUMENT_ROOT}$1/${hostmap:%{HTTP_HOST}}/$2 -f
RewriteRule ^(.*)/(.*) $1/${hostmap:%{HTTP_HOST}}/$2 [L]
4

1 回答 1

2

试试这个规则:

RewriteCond %{HTTP_HOST} ^(skin\d+)\.example\.com$
RewriteCond %{DOCUMENT_ROOT}$1/%1/$2 -f
RewriteRule ^([^/]+)/([^/]+)$ $1/%1/$2 [L]
于 2010-04-20T19:39:55.690 回答