5

mod_rewrite 条件/ルールに奇妙な問題があります。

これは私が使用している条件とルールです。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)$ index.php?params=$1 [QSA,L]

私の問題は、www.example.com と www.example.com/page にアクセスすると正常に読み込まれますが、www.example.com/page/category を読み込もうとするとページは読み込まれますが、CSS と JavaScript が見つからないことです。/ ディレクトリではなく page/css からロードしようとします。

私が間違ったことについて何か考えはありますか?ここで検索して、追加のようないくつかのことを試しました

RewriteCond $1 !\.(js|ico|gif|jpg|png|css|html|swf|mp3|wav|txt)$ 

RewriteRule ^(images|css|javascript)(.*)$ index.php?params=$1 [QSA,L]

しかし、それは大きな違いをもたらさなかったようです。

読んでくれてありがとう

4

2 に答える 2

2

問題は、サイレント リライトが訪問者の Web ブラウザに、実際には別のディレクトリ パスからページを見ていることを伝えないことです。

そのため、/page に対する要求は、ブラウザーが (正しく) Web サーバーのトップレベルのパブリック ディレクトリにあるリソースを見ていると考えて、画像や CSS ファイルと同様に残します。

しかし、/page/category へのリクエストは、ページというサブディレクトリにあるリソースを見ているとブラウザに (誤って) 認識させます。そのため、ブラウザーが CSS と画像ファイルの要求を送信すると、実際には存在しない /page/ サブディレクトリでそれらを探すようにサーバーに要求します。そのため、ブラウザが画像と CSS ファイルを取得しようとすると、サーバーは 404 コードを返します。

これを回避する 1 つの方法は、CSS、画像、およびその他のページ参照リソースへのパスを絶対パスに変更することです。実際の最上位の公開ディレクトリに対して相対的に固定されるように、スラッシュで開始します。更新するリソース パスの数が少ない場合は、おそらくこれが最善の方法です。たとえば、次のように変更します。

src="image-name.png"

の中へ

src="/image-name.png"

これにより、ブラウザーは、相対パスに基づいて間違った場所を推測するのではなく、絶対パスを使用してファイルを要求するようになります。

RewriteCond の必要性をなくすには、RewriteRule を次のように変更します。

RewriteRule ^([a-z]+(?:/[a-z]+)*)$ index.php?params=$1 [QSA,L]

これは、ピリオド (ドット) 記号を含むものには一致しないため、画像および CSS ファイルの要求はスキップされます。

于 2013-03-24T20:53:55.737 に答える