6

次の htaccess ルールをより詳細に理解しようとしています。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
  RewriteRule (.+) index.php?p=$1 [QSA,L]
</IfModule>

具体的には、REQUEST_FILENAME の仕組みを理解しようとしています。mod_rewrite ドキュメントからスタック オーバーフローに関する回答まで、これについて議論しているいくつかのリソースがあります。しかし、私が探しているものに正確に対処しているようには見えません.REQUEST_FILENAME変数を詳しく見て、その値を確認するにはどうすればよいですか?

通常、.htaccess で参照されている変数を調べたいときは、print_r を使用して $_SERVER グローバルを調べ、それらの値がサーバーのものかどうかを確認します。

echo "<pre>";
print_r($_SERVER);
echo "</pre>";
die('fin');

これは、上記の $_SERVER['REQUEST_URI'] などの値を確認するのに役立ちます。しかし、私の現在の環境では、REQUEST_FILENAME が PHP $GLOBALS のいずれでも利用できるようには見えません。私は SCRIPT_FILENAME の値を確認しており、これら 2 つの値が等しいといくつかの情報源が述べていますが、それらが代用されているのか、最初の値が存在しない場合に REQUEST_FILENAME が SCRIPT_FILENAME にフォールバックするのかは明らかではありません。

htaccess ルールを少し更新して URL に値を出力し、最後の行を次のように変更することで、REQUEST_FILENAME 値を出力できました。

RewriteRule (.+) index.php?p=%{REQUEST_FILENAME} [R=302,QSA,L]

しかし、この値が PHP のどこにもないのはなぜでしょうか? この変数が格納されている場所と、PHP を介してその値を表示する方法を理解するのに役立つ見落としているものはありますか?

4

1 に答える 1

5

からRewriteCond

REQUEST_FILENAME
要求に一致するファイルまたはスクリプトへの完全なローカル ファイルシステム パス (REQUEST_FILENAME が参照された時点でサーバーによって既に決定されている場合)。それ以外の場合 (仮想ホスト コンテキストで使用される場合など)、REQUEST_URI と同じ値。AcceptPathInfo の値によっては、サーバーが REQUEST_URI の一部の主要コンポーネントのみを使用して、要求をファイルにマップした可能性があります。

そしてから$_SERVER

'SCRIPT_FILENAME'
現在実行中のスクリプトの絶対パス名。

REQUEST_URIが実際に既存のファイルに対応している場合、これは同じ (スクリプトへのフル パス) になります。

そうでない場合は、実行中の PHP スクリプトの名前になりますREQUEST_FILENAME。(別名)になります。REQUEST_URISCRIPT_FILENAME$_SERVER['REQUEST_URI']REQUEST_FILENAMEREQUEST_URI

あなたの場合、SCRIPT_FILENAME常にあり/path/to/index.phpREQUEST_FILENAME/REQUEST_URIからアクセスできます$_SERVER['REQUEST_URI']

更新

REQUEST_URIドキュメントルートプレフィックスがないため、ファイル名にはなりません。使用するとき

RewriteCond %{REQUEST_URI} !-f

要求された URL が既存のファイルと一致する場合でも、条件は常に true になります。以下RewriteRuleは常に実行されますが、別の PHP スクリプトを呼び出すか、HTML、CSS、または画像ファイルを提供する必要があります。

更新

実際に質問に答えるために。

しかし、この値が PHP のどこにもないのはなぜでしょうか?

REQUEST_FILENAME環境またはリクエストのヘッダーにないため、PHP では使用できません。

PHP で確認できるのは、環境変数またはヘッダー内にあるか、PHP 自体が推測できるものだけです。PHP はリクエスト URI とファイル名を接続しようとしないか、接続できないため、どこからでもアクセスできません。REQUEST_FILENAME結局のところ、ファイルシステムのどこにでもある可能性があります。

ただし、自分で環境に配置することはできます

RewriteRule (.+) index.php?p=$1 [QSA,L,E=REQUEST_FILENAME:%{REQUEST_FILENAME}]

としてPHPでアクセスします$_SERVER['REDIRECT_REQUEST_FILENAME']

于 2013-04-10T20:45:34.320 に答える