0

着信ホストヘッダーに基づいて別の静的コンテンツファイルを選択したいという問題に取り組んでいます。簡単な例は、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

また、マップ呼び出しで直接%{HTTP_HOST}を使用するようにRewriteRulesを変更しました。これは、機能しているようです。

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 に答える