現在、*.php に対して 404 エラーを返し、すべてのリクエストを内部的に PHP ファイルが存在する場合は、次のようにリダイレクトしています。
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.+)$ - [R=404]
これはうまくいきます。ただし、index.php.srcなどのファイルからPHP(またはその他の)ソース(適切な拡張子を付けて)を提供する機能が必要ですが、直接アクセスするとindex.php.srcも404を返します。
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]
これは機能していないようです。内部で index.php、次に index.php.src、404s にリダイレクトします。
興味深いのは、最初のサンプルでは、環境変数が 2 番目のルールセットの実行を妨げ、ページが期待どおりに読み込まれることです。2 番目のサンプルにある中間のルールセットを追加すると、環境変数はもはや効果がないように見えます。2 番目のサンプルから 2 番目のルールセットを削除し、最後のルールセットに追加の行をそのまま残すと、最初のサンプルと同じように動作します (たとえば、index.php.src を要求すると 404 が返される点が異なります)。 .
さまざまな理由から、この目的でクエリ文字列を使用することは受け入れられません。それは環境変数でなければなりません。
どうすればこれを機能させることができますか?私は何を間違っていますか?
編集: 説明が不十分な場合に備えて(説明したと確信しています)...
- 「index.php」と「index.php.src」の 2 つのファイルが存在します。
- 最初のルール セットで http://domain.com/ をリクエストすると、(予想どおり) ホームページが表示されます。2 番目のルール セットを使用すると、404 が返されます。2 番目のルール セットから 2 番目のスタンザを差し引いた場合、(予想どおり) 私のホームページが表示されます。
- いずれかのルール セットで http://domain.com/index を要求すると、予想どおり 404 が返されます。
- どちらかのルール セットで http://domain.com/index.php を要求すると、404 が返されます。これは最初のセットで予期されますが、'index.php.src' のコンテンツが提供されることを期待しています。
- 最初のルール セットで http://domain.com/index.php.src をリクエストすると、*.src の 404 に対するルールが適用されないため、予想どおり「index.php.src」のコンテンツが取得されます。そのセットで。2 番目のスタンザの有無にかかわらず、2 番目のセットで期待どおり 404 を取得します。
問題は 2 番目のスタンザにあるようですが、何が問題なのかわかりません...