0

Lighty の mod_rewrite モジュールに問題があります。

私はこれを作ろうとしています:

上記のように動作させたいのですが、ディレクトリ /images/ や index.php、favicon.ico、style.css などのファイルなど、すべての物理ディレクトリとすべてのファイルを書き換えから除外したいと考えています。奇妙に振る舞う。

どうすればこれを達成できますか?私は次のことを試しましたが、これは私が望んでいたことには問題ありませんでしたが、ディレクトリとファイルを除外すると実際には機能しませんでした:

url.rewrite-once = (
"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",
"^/(images|js|wp-content)/(.*)" => "$0",
"(.*\.php|.*\.css|favicon.ico)" => "$0" )

ちなみに、これにはどのような違いがありますか:

"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",

この:

"^/(.*)$" => "/index.php?search=$1"
4

1 に答える 1

1

訪問者のリクエストが人工的なパスではなく実際のファイルではないことを確認する RewriteCond ディレクティブを多数追加する必要がないようにするには、/search/whateverパターンを優先してパターンを使用することをお勧めし/whateverます。次に、「検索」と呼ばれる実際のディレクトリを作成しない限り、で始まるパス/searchが実際のファイル パスであるかどうかを確認する必要はありません。したがって、RewriteRule は次のように単純になります。

RewriteRule ^/search/([a-zA-Z0-9_-]+)$ /index.php?search=$1

(私は Lighty に詳しくないので、これを url.rewrite-once 命令に変換する方法がわかりませんが、これは非常に単純な書き直しなので、簡単なはずです。)

ただし、訪問者のブラウザーは、「検索」と呼ばれるサブディレクトリにあるページを表示していると見なすようになるため、相対パス (ルート ディレクトリに固定されていないパス) で指定された画像要素または CSS ファイルがある場合は、 assrc="images/photo.jpg"またはhref="stylesheets/clean.css"then ブラウザは、これらのパスが「検索」ディレクトリに相対的であると見なし、Web サーバーにそれぞれ および を要求し/search/images/photo.jpgます/search/stylesheets/clean.css

これには 2 つの方法があります。1 つ目は、すべてのページ装飾 (画像、スタイルシート、JavaScript) パスを絶対パスに変更することです。つまり、Web サイトのルート ディレクトリを表すスラッシュで始まるようにパスを変更します。src="/images/photo.jpg"したがって、画像のパスをに、スタイルシートのパスをに変更する必要がありますhref="/stylesheets/clean.css"。先頭のスラッシュは、パスがサイトのルート ディレクトリから始まることを Web ブラウザーに伝えるため、あいまいさはありません。

2 番目のオプションは、複雑な RewriteRules を作成して、画像、スタイルシート、スクリプト ファイルなどの要求を正しいディレクトリにリダイレクトすることです。多くの異なるディレクトリに多くのメディアタイプがあり、それらを多くの異なるサブディレクトリ (仮想および/またはその他) から作業する必要がある場合、これは見苦しく壊れやすい傾向があります。

どのオプションを選択するかは、要件と好みによって異なります。

[a-zA-Z0-9_-]+と最初のパターンの違いについての質問に関しては、.*文字 a から z (小文字または大文字)、数字、アンダースコア、およびハイフンのみを使用できます。2 番目のパターンでは、任意の文字を使用できます。セキュリティとデバッグの理由から、通常は、文字を許可する必要があるものだけに制限するパターンを使用することをお勧めします。したがって、すべての文字を許可するのではなく、必要に応じて許可された文字を追加して、最初のパターンを使用します。

于 2013-04-20T21:10:47.797 に答える