web-dev-qa-db-ja.com

ファイルが見つからない場合にのみリクエストをリダイレクトしますか?

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ルートが優先されます。

17
DivideByHero

上記の各例には、少なくとも1つの問題があるようです。 %{DOCUMENT_ROOT}は特定の場所で間違ったことをしているようで、いくつかの/文字が欠落しているようです。これが私の解決策です。これは.htaccessWebルート内。

2つのルール(clients /の下のファイルが見つかった場合と見つからなかった場合)を使用する代わりに、要求されたファイル(またはディレクトリ)が存在しないかどうかを確認するだけです。存在する場合、変更は必要ないため、クライアントディレクトリで提供されるファイルを使用するだけで済みます。これが私が決めたコードです:

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

ご協力いただきありがとうございます!

5
DivideByHero
# 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 ファイルが存在しない場合は書き換えます

25
Jeremy L

これはどう?

# 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]
10
Happy
RewriteCond %{REQUEST_FILENAME} !-f
3
chaos

これを試して:

RewriteEngine on
RewriteRule ^clients/abc/ - [L]
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f
RewriteRule .* clients/abc/$0 [L]
0
Gumbo

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

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