2011-07-16 9 views
2

URLとパスを変更するために書き換えルールが面白いです。ここでいくつかの例。 私は、Apache conf内の1つのVirtualHost through ServerAliasを参照するいくつかのホスト名を持っています。
example.com
anotherdomain.com
same.org

そしてanothersドメインがたくさん。ここでは、私がやりたいこと:別のドメインを持つ
動的ホスト名による書き換えルール

example.com/uploads/photo.png -> /www/example.com/uploads/example.com/photo.png<br /> 

anotherdomain.com/uploads/photo.png -> /www/anotherdomain.com/uploads/anotherdomain.com/photo.png<br /> 

と同じこと。私がすでに作ったこの事。

RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteRule ^uploads/([a-zA-Z0-9-\._]+)$ uploads/%2/$1 [L] 

これは完全に機能します。しかし、私がアップロード/アイコン/カテゴリ/ image.png
にアクセスしようとした場合、私は500内部Apacheのエラーを見始める... 私はこれにルールを変更しました:

RewriteCond %{REQUEST_URI} !^/uploads/%{HTTP_HOST} 
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L] 

とApacheのリライトログを有効にします9冗長で

RewriteCond: input='/uploads/icons/category/image.png' pattern='!^/uploads/%{HTTP_HOST}' => matched 
rewrite 'uploads/icons/category/image.png' -> 'uploads/example.com/icons/category/image.png' 
RewriteCond: input='/uploads/example.com/icons/category/image.png' pattern='!^/uploads/%{HTTP_HOST}' => matched 
rewrite 'uploads/example.com/icons/category/image.png' -> 'uploads/example.com/example.com/icons/category/image.png' 

その後、それはだ
は=(
10回のルックアップを使い果たす私はこの

RewriteCond %{REQUEST_URI} !^/uploads/example.com 
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L] 

それの作品は、すべてのもののためにperfectleが、わずか1つのドメイン用に変更する場合:example.com
私は別の解決法を見つけましたが、完璧ではありません。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L] 

このルールは、dirおよびfileが存在する場合にのみ機能します。しかし、私がアクセスしようとした場合:
/uploads/images/not-existed-404.nothing - >このファイルが存在し、に書き換えていないので、それは500を返す:

/uploads/example.com/example.com/example.com/example.com....... 

P.S.私の悪い英語のため申し訳ありません;)

答えて

4
RewriteCond %{REQUEST_URI} !^/uploads/%{HTTP_HOST} 

あなたは、パターンの中の変数や後方参照を使用することはできません - すなわち%{HTTP_HOST}ではなく、それは通常のテキストとして扱われます、example.comに展開されることはありません。


することができますが、これらのルール(私のPC上で正常に動作)を使用しています:

RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f 
RewriteRule ^uploads/(.+)$ uploads/%2/$1 [L] 
  1. このルールでは、対象ファイルが存在しないかどうかを確認し、だけにして(条件状物質の順)を書き換えてます。

  2. はのは、仮定しましょう:

    • ドメイン名:example.com
    • ウェブサイトのルート:要求された/www/example.com/
    • URL:/uploads/img/meow.png

    ファイル/www/example.com/uploads/example.com/img/meow.pngが存在する場合は、2番目の条件(RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f)をチェックします、そうであれば、書き換えが発生します。

あなたの.htaccessファイルは、次のようになります。

RewriteEngine On 
RewriteBase/

# do not do anything for already existing files & folders 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L] 

# rewrite uploads to domain-specific folder 
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f 
RewriteRule ^uploads/(.+)$ uploads/%2/$1 [L] 
+0

非常に大きな感謝を!すべて正常に動作します! – libbkmz