web-dev-qa-db-ja.com

PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI

CodeIgniterでPHPアプリケーションを作成しています。CodeIgniterはすべてのリクエストをメインコントローラーに送信します:index.php。ただし、URIにindex.phpが表示されません。たとえば、http://www.example.com/faq/whateverhttp://www.example.com/index.php/faq/whatever。スクリプトがアドレスを知るための信頼できる方法が必要なので、ナビゲーションで何をすべきかを知ることができますCodeIgniterのドキュメントに従ってmod_rewriteを使用しました。

ルールは次のとおりです。

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L] 

通常、php_selfをチェックするだけですが、この場合は常にindex.phpです。 REQUEST_URIPATH_INFOなどから取得できますが、どちらが最も信頼できるかを判断しようとしています。 PHP_SELFPATH_INFOSCRIPT_NAME、およびREQUEST_URIの本当の違いを誰もが知っていますか(または見つける場所を知っていますか)?ご協力いただきありがとうございます!

:SOはアンダースコアを参照し、何らかの理由で斜体にするため、スペースを追加する必要がありました。

更新:スペースを修正しました。

99
Eli

PHPドキュメント は違いを教えてくれます:

「PHP_SELF」

ドキュメントルートを基準とした、現在実行中のスクリプトのファイル名。例えば、 $ _SERVER ['PHP_SELF'] 住所のスクリプトで http://example.com/test.php/foo.bar だろう /test.php/foo.bar__ FILE __ 定数には、現在の(つまり含まれている)ファイルのフルパスとファイル名が含まれます。 PHPがコマンドラインプロセッサとして実行されている場合、この変数にはPHP 4.3.0以降のスクリプト名が含まれます。以前は利用できませんでした。

「SCRIPT_NAME」

現在のスクリプトのパスが含まれます。これは、自分自身を指す必要があるページに役立ちます。 __ FILE __ 定数には、現在の(つまり含まれている)ファイルのフルパスとファイル名が含まれます。

「REQUEST_URI」

このページにアクセスするために指定されたURI。例えば、 '/index.html'

PATH_INFOが文書化されていないようです...

48
Jeremy Ruten

これらの変数間の違いの実用的な例:
例1. PHP_SELFは、要求されたURLが次の形式の場合、SCRIPT_NAMEonlyとは異なります。
http://example.com/test.php/foo/bar

[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php

(これは、PATH_INFOに賢明な情報が含まれる場合の唯一のケースです[PATH_INFO] =>/foo/bar)注:これは、以前のPHPバージョン(<= 5.0?) 。

例2.空でないクエリ文字列が入力された場合、REQUEST_URIはSCRIPT_NAMEとは異なります。
http://example.com/test.php?foo=bar

[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar

例3.サーバー側のリダイレクトが有効な場合、REQUEST_URIはSCRIPT_NAMEとは異なります(たとえば、Apacheのmod_rewrite)。

http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php

例4.スクリプトでHTTPエラーを処理する場合、REQUEST_URIはSCRIPT_NAMEとは異なります。
ApacheディレクティブErrorDocument 404 /404error.phpの使用
http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php

オンIISカスタムエラーページを使用するサーバー
http://example.com/test.php

[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php
218
Odin

PATH_INFOは、次のようにhtaccessを使用する場合にのみ使用できます。

例1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

同じまま

[SCRIPT_NAME] => /index.php

Root

http://domain.com/

[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]  => /
[QUERY_STRING] => 

パス

http://domain.com/test

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test
[QUERY_STRING] => 

クエリ文字列

http://domain.com/test?12

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test?123
[QUERY_STRING] => 123

例2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

同じまま

[SCRIPT_NAME]  => /index.php
[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)

Root

http://domain.com/

[REQUEST_URI]  => /
[QUERY_STRING] => 

パス

http://domain.com/test

[REQUEST_URI]  => /test
[QUERY_STRING] => url=test

クエリ文字列

http://domain.com/test?12

[REQUEST_URI]  => /test?123
[QUERY_STRING] => url=test&123

例3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]

または

RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

同じまま

[SCRIPT_NAME] => /index.php

Root

http://domain.com/

[PHP_SELF]          => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]       => /
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] IS NOT AVAILABLE

パス

http://domain.com/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /test
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => 

言語

http://domain.com/en

[PHP_SELF]          => /index.php/
[PATH_INFO]         => /
[REQUEST_URI]       => /en
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => en

言語パス

http://domain.com/en/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test
[REDIRECT_LANGUAGE] => en

言語クエリ文字列

http://domain.com/en/test?12

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test?123
[QUERY_STRING]      => 123
[REDIRECT_LANGUAGE] => en
21
Mike

PHPパス

  $_SERVER['REQUEST_URI']    = Webパス、要求されたURI
  $_SERVER['PHP_SELF']    = Webパス、要求されたファイル+パス情報
  $_SERVER['SCRIPT_NAME']    = Webパス、要求されたファイル
  $_SERVER['SCRIPT_FILENAME']   =ファイルパス、要求されたファイル
  __FILE__    =ファイルパス、現在のファイル

どこで

  • ファイルパスシステムファイルパスエイリアス解決後の/var/www/index.phpのように
  • Webパスサーバードキュメントパス/index.php from http://foo.com/index.phpのようで、どのファイルにも一致しない場合があります
  • 現在のファイル含まれているスクリプトファイルを意味し、それを含むスクリプトではありません
  • 要求されたファイルインクルーダースクリプトファイルを意味し、含まれるものではありません
  • [〜#〜] uri [〜#〜]HTTPリクエストのような/index.php?foo=barで、URLの書き換え前
  • パス情報は、スクリプト名の後、クエリ文字列の前にある追加のApacheデータです。

操作の順序

  1. クライアントはサーバーにHTTPリクエストREQUEST_URIを送信します
  2. サーバーは.htaccessファイルなどからRL rewritingを実行してPHP_SELFを取得します
  3. サーバーはPHP_SELFSCRIPT_FILENAME + PATH_INFOに分離します
  4. サーバーはエイリアス解決を実行し、rl path全体をsystem file pathに変換してSCRIPT_FILENAMEを取得します
  5. 結果のスクリプトファイルには他のものが含まれる場合があります。__FILE__は現在のファイルへのパスを指します
8
Beejor

RI Class を調べて、$ this-> uri-> uri_string()を使用することもできます。

完全なURIを含む文字列を返します。

たとえば、これが完全なURLの場合:

http://example.com/index.php/news/local/345

関数はこれを返します:

/news/local/345

または、セグメントを使用して、解析/正規表現の値を考え出すことなく特定の領域をドリルダウンできます。

4
Adam

個人的には$REQUEST_URIサーバーのディスク上の場所ではなく、入力されたURIを参照するため。

3
Xenph Yan

オーディンの答えに追加することはほとんどありません。 URL書き換えとエイリアスの効果を説明するために、HTTP要求からファイルシステム上の実際のファイルへの完全な例を提供したいと感じました。ファイルシステムでは、スクリプト/var/www/test/php/script.php

<?php
include ("script_included.php")
?>

ここで、/var/www/test/php/script_included.php

<?php
echo "REQUEST_URI: " .  $_SERVER['REQUEST_URI'] . "<br>"; 
echo "PHP_SELF: " .  $_SERVER['PHP_SELF'] . "<br>";
echo "QUERY_STRING: " .  $_SERVER['QUERY_STRING'] . "<br>";
echo "SCRIPT_NAME: " .  $_SERVER['SCRIPT_NAME'] . "<br>";
echo "PATH_INFO: " .  $_SERVER['PATH_INFO'] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
echo "__FILE__ : " . __FILE__ . "<br>";  
?>

/var/www/test/.htaccess

RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1 

apache構成ファイルにはエイリアスが含まれています

Alias /test/after_rewrite/ /var/www/test/php/

そして、httpリクエストは

www.example.com/test/before_rewrite/script.php/path/info?q=helloword

出力は

REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword
PHP_SELF: /test/after_rewrite/script.php/path/info
QUERY_STRING: q=helloword
SCRIPT_NAME: /test/after_rewrite/script.php
PATH_INFO: /path/info
SCRIPT_FILENAME: /var/www/test/php/script.php
__FILE__ : /var/www/test/php/script_included.php

次は常に成り立ちます

PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string. 

Mod_rewrite、mod_dir、ErrorDocument rewrite、または任意の形式のURL書き換えがない場合、

REQUEST_URI = PHP_SELF + ? + QUERY_STRING 

エイリアスは、以前に定義されたURLパスではなく、システムファイルパスSCRIPT_FILENAMEおよび__FILE__に影響します。以下の例外を参照してください。エイリアスは、PATH_INFOを含むURLパス全体を使用する場合があります。 SCRIPT_NAMESCRIPT_FILENAMEの間にはまったく接続がありません。

URLパス[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]の定義時にエイリアスが解決されないことは完全に正確ではありません。エイリアスはファイルシステムを検索すると見なされ、Odinの回答の例4から、ファイルシステムがファイルが存在するが、これはファイルが見つからない場合にのみ関係します。同様に、mod_dirはmod_aliasを呼び出してファイルシステムを検索しますが、これはAlias \index.php \var\www\index.phpなどのエイリアスがあり、リクエストuriがディレクトリである場合にのみ関連します。

3
user2066805

どの変数が何をするかを忘れた場合、 phpinfo() を使用する小さなスクリプトを記述し、クエリ文字列を使用してURLから呼び出すことができます。サーバーソフトウェアのインストールでは、PHPが返す変数を提示するため、サーバー構成ファイルでの書き換えが予想とは異なる結果を引き起こす場合は、マシンの出力を確認することをお勧めします。_inf0.php

<?php
    $my_ip = '0.0.0.0';

   if($_SERVER['REMOTE_ADDR']==$my_ip){
     phpinfo();
   } else {
     //something
   }

次に、/_inf0.php?q=500を呼び出します

0
AbsoluteƵERØ