Mod_rewriteとApacheでこれを行う方法があることを望んでいますが、おそらく別の方法も検討する必要があります。
私のサイトには、クライアント用にスキンを変更したバージョンのサイト用にディレクトリを設定しています。 Webルートが/home/blah/www
の場合、クライアントディレクトリは/home/blah/www/clients/abc
になります。 Webブラウザを介してクライアントディレクトリにアクセスする場合、クライアントディレクトリに要求されたファイルが存在する場合はそれを使用するようにします。それ以外の場合は、Webルートのファイルを使用する必要があります。
たとえば、クライアントが独自のindex.html
を必要としないとします。したがって、一部のコードは、index.html
に/home/blah/www/clients/abc
がないと判断し、代わりに/home/blah/www
にあるものを使用します。クライアントをいつでもWebルートにリダイレクトしたくないことを覚えておいてください。クライアントディレクトリが独自のコピーを指定していない場合は、その名前のWebルートのファイルを使用したいだけです。 Webブラウザーは、ファイルがそこに存在するかルートに存在するかにかかわらず、/clients/abc
をポイントする必要があります。同様に、クライアントディレクトリにnews.html
のリクエストがあり、それが存在する存在する場合は、Webルートのnews.html
の代わりにそのファイルを提供するだけです。ユーザーエクスペリエンスはシームレスである必要があります。
任意のファイル名のリクエストで機能するためにこれが必要です。たとえば、リダイレクトする可能性のあるすべてのファイルの.htaccess
に新しい行を追加する必要がある場合、メンテナンスが多すぎるため目的が果たせず、数が多いとエラーが発生する可能性が高くなります。ファイルの。
あなたの例では、あなたのコードがクライアントディレクトリの.htaccessファイルにあるのか、それともウェブルートにあるのかを示してください。 Webルートが優先されます。
上記の各例には、少なくとも1つの問題があるようです。 %{DOCUMENT_ROOT}
は特定の場所で間違ったことをしているようで、いくつかの/
文字が欠落しているようです。これが私の解決策です。これは.htaccess
Webルート内。
2つのルール(clients /の下のファイルが見つかった場合と見つからなかった場合)を使用する代わりに、要求されたファイル(またはディレクトリ)が存在しないかどうかを確認するだけです。存在する場合、変更は必要ないため、クライアントディレクトリで提供されるファイルを使用するだけで済みます。これが私が決めたコードです:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L]
ご協力いただきありがとうございます!
# 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]
From ファイルが存在しない場合は書き換えます
これはどう?
# 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]
RewriteCond %{REQUEST_FILENAME} !-f
これを試して:
RewriteEngine on
RewriteRule ^clients/abc/ - [L]
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f
RewriteRule .* clients/abc/$0 [L]
私はあなたがこれらの線に沿って何かが欲しいと思います:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L]
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L]