代码之家  ›  专栏  ›  技术社区  ›  Kevin Hakanson

使用mod rewrite根据主机头有条件地选择子目录中的现有文件?

  •  0
  • Kevin Hakanson  · 技术社区  · 14 年前

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

    • www.example.com/images/logo.gif -&燃气轮机\图像\logo.gif
    • skin2.example.com/images/logo.gif->\图片\skin2\logo.gif

    我有以下的重写规则,但我不喜欢这样我必须重复自己这么多。每个主机都有一组相同的规则,每个 RewriteCond RewriteRule 有相同的路径。我想使用 RewriteMap ,但我不知道如何使用它将%{HTTP\u 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>
    

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

    更新:

    • www.example.com/images/logo.gif -&燃气轮机\图像\logo.gif
    • skin2.example.com/images/logo.gif->\图片\s2\logo.gif

    用于 重写映射 ,我创建了此数据文件:

    ##  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\u 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]
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Gumbo    14 年前

    尝试此规则:

    RewriteCond %{HTTP_HOST} ^(skin\d+)\.example\.com$
    RewriteCond %{DOCUMENT_ROOT}$1/%1/$2 -f
    RewriteRule ^([^/]+)/([^/]+)$ $1/%1/$2 [L]