Apache2 mod_rewrite クリーン URL - 動作しているが、ファイルにアクセスできない

Apache2 mod_rewrite クリーン URL - 動作しているが、ファイルにアクセスできない

サーバー: Debian Jessie Apache: 2.4.9-1 PHP: 5.5

私が望んでいるのは、ファイルとディレクトリ以外のすべてのものを、自分で処理する index.php にリダイレクトすることです。プロジェクトの性質上、仮想ホスト内から作業する必要があります。

私が取り組んでいる Web プロジェクトでは、仮想ホスティング (vHosts) と mod_rewrite を使用しています。vHost ファイルは次のとおりです...

<VirtualHost *:80>

        ServerName foo.com

        ServerAlias www.foo.com

        ServerAdmin [email protected]

        DocumentRoot /srv/foo/main/www/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <IfModule mod_rewrite.c>

                RewriteEngine on

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

                RewriteRule ^(.*)$ /index.php [L]

        </IfModule>

</VirtualHost>

vHost は期待どおりに動作しており、書き換えルールは要求を期待どおりに index.php にリダイレクトしています。ただし、サーバー上のファイルにアクセスしようとすると、たとえば次のようになります。

foo.com/css/style.css

にあります:

/srv/foo/main/www/css/style.css

リクエストはindex.phpにリダイレクトされます

書き換え条件ステートメントはこれを修正するはずなので、これは奇妙です。

すべてのフォルダーの権限は 755 に設定され、すべてのファイルは 644 に設定されています。

書き換え条件が一致しないはずのときに一致していることを疑いなく確認できました。mod_rewrite のデバッグ出力を有効にして Apache のエラー ログを調べることで、これを確認することができました。

2 つの RewriteCond ステートメントが誤って一致しているのはなぜですか?

おそらく vHost DocumentRoot が表示されていないのでしょうか?

更新: 書き換えエンジンをオフにすると、テストしているファイルにアクセスできるようになります。つまり、URI は正しいということです。パスは適切ですが、何らかの理由で条件が満たされていないだけです。

答え1

仮想ホストで Apache 2.4 を使用しており、仮想ホスト内のファイルまたはフォルダーをチェックする必要がある書き換え条件で、その仮想ホスト内で mod_rewrite を使用したい場合、書き換え条件を実行する方法は次のようになります...

<VirtualHost *:80>

       <IfModule mod_rewrite.c>

                RewriteEngine on

                RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
                RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d

                RewriteRule ^(.*)$ /index.php [L]

        </IfModule>

</VirtualHost>

これを思いつきましたが、うまく機能しているようです。

説明...

%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}コンテキスト依存のドキュメント ルートが提供されます。つまり、仮想ホスティングが適用された後のドキュメント ルートです。ただし、URI は提供されないため、%{REQUEST_URI}ジョブを完了するには を追加する必要があります。

CONTEXT_DOC_ROOT == /srv/foo/main/www

リクエストURI == /css/style.css

CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css

残りは簡単です。素晴らしいソースです。お役に立てれば幸いです。

関連情報