1

現在、*.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 番目のスタンザにあるようですが、何が問題なのかわかりません...

4

1 に答える 1

0

これが私がやったことです:

RewriteCond %{IS_SUBREQ} false
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]

%{IS_SUBREQ} ビットを追加したことにお気付きでしょう。これは、404 への原因となっていたホームページのリダイレクトの問題を解決するのに役立ちました。 「私はそれをそのままにしておくタイプではありません、私はこれができることを知っていました、そして私はそれをするつもりでした(私はやった!)

明確にするために変数名を「norewrite」から「STOP」に変更したことは別として、内部リダイレクトが発生すると、mod_rewrite によって設定された環境変数に「REDIRECT_」というプレフィックスが付けられることを知りました。そのため、'norewrite' ('STOP') の値を設定してから、同じ変数をチェックしても機能しませんでした。チェック行で「REDIRECT_」を追加すると、期待どおりに動作するようになりました。

  • 「/awesome」をリクエストすると、「awesome.php」が処理され、その出力が返されます
  • 「/awesome.php」をリクエストすると、「awesome.php.src」のコンテンツが返されます (「awesome.php」へのシンボリックリンク)。
  • 「awesome.php.src」をリクエストすると、404 が返されます

これはまさに私が欲しかったものです!うまくいけば、これは他の誰かにも役立つでしょう。

于 2012-08-04T18:18:08.793 に答える