0

私の.htaccessファイルには、次の書き換えルールがあります。
RewriteRule example actual-page.php [L]


www.mysite.com/exampleこれは単純に次のように書き直します:www.mysite.com/actual-page.php

私が抱えている問題exampleにより、ルールとの混乱により、ファイル名 (my_example.png) に含まれる画像が読み込まれません。

ルールを次のように変更して問題を修正しました。
RewriteRule /example /actual-page.php [L]

これに対する正しい解決策が何であるかを知りたいだけです。mod_rewrite の世界で学ぶべきことはまだたくさんあります。この種の問題に対して実装された修正があるかどうか、またはルールをより具体的にする必要があるかどうかを知りたいです。

4

2 に答える 2

2

ルールの先頭に次の行を追加します。

RewriteCond %{REQUEST_FILENAME} !-f

これは、要求された URL が実際のファイルでない場合にのみ、次のルールが一致することを意味します。

于 2013-01-14T23:36:27.720 に答える
1

書き換えルールは次のRewriteRule example actual-page.php [L]ことを意味します。

現在の URL で正規表現を検索し、example見つかった場合は URL を に置き換えますactual-page.php。その後、書き換えプロセスを終了し、以降のルール (L フラグ) を無視します。

この正規表現は、文字列「example」が「example.png」だけでなく「another-example-from-a-different-url」を含む URL のどこかにある場合にトリガーされます。

そのため、正規表現でどこも検索しないようにし、URL 文字列全体、または少なくとも重要な部分に一致するように指定することをお勧めします。そのための構文文字は、「文字列の開始」を表す「^」と「文字列の終了」を表す「$」です。これにより、ルールが に変更されますRewriteRule ^example$ actual-page.php [L]

一方、URL には実際にはスラッシュが含まれており、これはもはや一致することが許可されていないため、これは機能しない可能性があります。次のように追加できますRewriteRule ^/example$ actual-page.php [L]。クエリ文字列はこの一致では使用されないことに注意してください。RewriteRule では検出できませんが、その前に RewriteCond 句を使用する必要があります。

仮想 URL を既存の PHP スクリプトに書き換えるが、HTML ファイルや画像などの既存のリソースには触れない一般的な使用例は次のようになります。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule .* - [L]
RewriteRule .* php-script.php [L]

これには逆のロジックがあります。最初のルールが一致し、要求されたファイル名がファイル、ディレクトリ、またはシンボリック リンクのいずれかである場合、書き換えは行われません。これにより、実際のリソースが要求された場合に書き換えがキャンセルされます。それ以外の場合は、同じ URL が 2 番目の RewriteRule で試行され、php-script.php が実行され、要求された URL を分析してそれに基づいて動作できます。

于 2013-01-15T00:21:06.740 に答える