2009-02-27 11 views
14

私はmod_rewriteとApacheでこれを行う方法があると思っていますが、多分考慮する別の方法もあります。ファイルが見つからない場合にのみリダイレクト要求を送信しますか?

私のサイトでは、クライアント用のサイトの再スキン化バージョン用にディレクトリを設定しています。 Webルートが/home/blah/wwwの場合、クライアントディレクトリは/home/blah/www/clients/abcになります。 Webブラウザ経由でクライアントディレクトリにアクセスするとき、クライアントディレクトリに要求されたファイルがあればそれを使用したいと思う。それ以外の場合は、Webルートのファイルを使用します。

たとえば、クライアントに独自のindex.htmlが必要ないとします。したがって、一部のコードではが/home/blah/www/clients/abcに存在しないと判断され、その代わりに/home/blah/wwwのものが使用されます。クライアントディレクトリが独自のコピーを指定していない場合は、いつでもWebルートのファイルをその名前で使用したいと思っています。ファイルが存在するかルートに存在するかにかかわらず、Webブラウザはまだ/clients/abcを指しているはずです。同様に、クライアントディレクトリにnews.htmlのリクエストがあり、にある場合はが存在します。ウェブルートのnews.htmlの代わりにそのファイルを提供してください。ユーザーの経験はシームレスでなければなりません。

すべてのファイル名でリクエストを処理するには、これが必要です。たとえば、リダイレクトしたいファイルごとに新しい行を.htaccessに追加する必要がある場合は、メンテナンスが必要なため、目的を破り、多数のファイルがあるとエラーが発生する可能性が高くなります。

例では、コードがクライアントディレクトリの.htaccessファイルまたはWebルートにあるかどうかを指定してください。 Webルートが優先されます。

答えて

4

:私はあなたがこれらの線に沿って何かをしたいと思います

RewriteEngine on 
RewriteRule ^clients/abc/ - [L] 
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f 
RewriteRule .* clients/abc/$0 [L] 
3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

私がしたいことをするには短すぎます。あなたは少し論理を説明できますか?ありがとう! – DivideByHero

23
# If requested resource exists as a file or directory, skip next two rules 
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$1 -d 
RewriteRule (.*) - [S=2] 
# 
# Requested resource does not exist, do rewrite if it exists in /archive 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d 
RewriteRule (.*) /archive/$1 [L] 
# 
# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 

Rewrite if files do not exist

0

からこのお試しください:私は、少なくとも一つの問題を持っているように見えた

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L] 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L] 
+0

これはWebルートの.htaccessを対象としていますか? – DivideByHero

+0

はい、ドキュメントルートディレクトリの.htaccessファイルを対象としています。 – Gumbo

0

をそれぞれの例ではaボブ。 %{DOCUMENT_ROOT}は、特定の場所で間違ったことをしたように見え、一部の/文字が欠けているようです。私の解決策はウェブルートの.htaccessにあります。

2つのルール(クライアント/の下のファイルが見つかった場合と見つからない場合の2つ)の代わりに、要求されたファイル(またはディレクトリ)が存在しないかどうかを確認する必要があります。存在する場合、変更は必要ありませんので、クライアントディレクトリに用意されているファイルを使用できます。ここに決済したコードは次のとおりです。

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d 
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L] 

ありがとうございました!

+0

良い点。しかし、。htaccessファイルは、パターンがスラッシュで始まらないようにする必要があります。また、DOCUMENT_ROOT変数を使用すると便利です。 – Gumbo

+0

これをDOCUMENT_ROOTでどのように更新するべきかを明確にすることはできますか?それはそのままでは機能しません。 – DivideByHero

+0

"%{DOCUMENT_ROOT}"でRewriteCond "/ home/blah/www /"を置換し、置き換えて削除します。また、正規表現パターンの先頭の「/」も削除してください。そうすればうまくいくはずです。 – Gumbo

9

これはいかがですか?

# If requested resource exists as a file or directory go to it 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.*) - [L] 

# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 
関連する問題