2

htaccessにURLに関連する特定のファイルを検索させ、見つからない場合は1ステップ戻ることができますか?

例:

/ example / here / where / from

Htaccessは、「/ example / here / where / from」が実際に何らかのファイル(/example/here/where/from.php)であるかどうかを確認します。これが失敗した場合は、1ステップ戻って、「」/ example/hereかどうかを確認します。 / where'はファイル(/example/here/where.php)などです。

ツリーに戻る必要がある場合は、次のようにパラメータとして想定します。

/example/here.php

$ _GET ['params'] ='where / from';

前もって感謝します

編集:

つづり

4

1 に答える 1

3

これは非常にトリッキーですが、これは、指定されたREQUEST_URIの親ディレクトリに再帰的にトラバースするコードであり、無限の深さをサポートします。

mod_rewriteと.htaccessを有効にしてからhttpd.conf、次のコードを.htaccessアンダーDOCUMENT_ROOTディレクトリに配置します。

# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
# If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
# don't do anything
RewriteRule ^ - [L]

# if current ${REQUEST_URI}.php is not a file then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{DOCUMENT_ROOT}/$1/$2.php !-f
RewriteRule ^(.*?)/([^/]+)/?$ $1/ [L]

# if current ${REQUEST_URI}.php is a valid file then 
# load it be removing optional trailing slash
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

説明:

元のURIが次のようになっているとしましょう/index/foo/bar/baz%{DOCUMENT_ROOT}/index.phpまた、それは存在しますが、他のphpファイルは。の下に存在しないとしましょうDOCUMENT_ROOT

RewriteRule#1には、現在のREQUEST_URIを2つの部分に分割する正規表現があります。

  1. ここに$1ある最低のサブディレクトリを除くすべてindex/foo/bar
  2. ここに$2ある最低のサブディレクトリbaz

%{DOCUMENT_ROOT}/$1/$2.phpRewriteCondは、 (これ%{DOCUMENT_ROOT}/index/foo/bar/baz.phpは)が有効なファイルではないかどうかをチェックします。

条件が成功すると、内部的にここにリダイレクトされ$1/ますindex/foo/bar/

RewriteRule#1のロジックが再度繰り返され、REQUEST_URIが(各再帰の後に)次のようになります。

  1. index/foo/bar/
  2. index/foo/
  3. index/

この時点で、ルール#1が${DOCUMENT_ROOT}/index.php存在するため、RewriteCondは失敗します。

私のRewriteRule#2は、が有効なファイルである$1.phpかどうかを転送します。%{DOCUMENT_ROOT}/$1.phpRewriteRule#2には、最後のスラッシュ以外のすべてに一致する正規表現があり、それをに入れることに注意してください$1。これ%{DOCUMENT_ROOT}/index.phpは、が有効なファイルであるかどうかを確認することを意味します(実際に有効です)。

この時点でmod_rewrite処理が完了します。これは、その後両方のRewriteCondが失敗し%{DOCUMENT_ROOT}/index.php、Apache Webサーバーによって適切に処理されるため、これ以上ルールを実行できないためです。

于 2012-05-07T20:38:23.047 に答える