CodeIgniterでPHPアプリケーションを作成しています。CodeIgniterはすべてのリクエストをメインコントローラーに送信します:index.php
。ただし、URIにindex.php
が表示されません。たとえば、http://www.example.com/faq/whatever
はhttp://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_URI
、PATH_INFO
などから取得できますが、どちらが最も信頼できるかを判断しようとしています。 PHP_SELF
、PATH_INFO
、SCRIPT_NAME
、およびREQUEST_URI
の本当の違いを誰もが知っていますか(または見つける場所を知っていますか)?ご協力いただきありがとうございます!
注:SOはアンダースコアを参照し、何らかの理由で斜体にするため、スペースを追加する必要がありました。
更新:スペースを修正しました。
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が文書化されていないようです...
これらの変数間の違いの実用的な例:
例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)。
[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
PATH_INFO
は、次のようにhtaccessを使用する場合にのみ使用できます。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test?123
[QUERY_STRING] => 123
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)
[REQUEST_URI] => /
[QUERY_STRING] =>
[REQUEST_URI] => /test
[QUERY_STRING] => url=test
[REQUEST_URI] => /test?123
[QUERY_STRING] => url=test&123
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
[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
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] =>
[PHP_SELF] => /index.php/
[PATH_INFO] => /
[REQUEST_URI] => /en
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] => en
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test
[REDIRECT_LANGUAGE] => en
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test?123
[QUERY_STRING] => 123
[REDIRECT_LANGUAGE] => en
$_SERVER['REQUEST_URI']
= Webパス、要求されたURI $_SERVER['PHP_SELF']
= Webパス、要求されたファイル+パス情報 $_SERVER['SCRIPT_NAME']
= Webパス、要求されたファイル $_SERVER['SCRIPT_FILENAME']
=ファイルパス、要求されたファイル __FILE__
=ファイルパス、現在のファイル
/var/www/index.php
のように/index.php
from http://foo.com/index.php
のようで、どのファイルにも一致しない場合があります/index.php?foo=bar
で、URLの書き換え前REQUEST_URI
を送信しますPHP_SELF
を取得しますPHP_SELF
をSCRIPT_FILENAME
+ PATH_INFO
に分離しますSCRIPT_FILENAME
を取得します__FILE__
は現在のファイルへのパスを指しますRI Class を調べて、$ this-> uri-> uri_string()を使用することもできます。
完全なURIを含む文字列を返します。
たとえば、これが完全なURLの場合:
http://example.com/index.php/news/local/345
関数はこれを返します:
/news/local/345
または、セグメントを使用して、解析/正規表現の値を考え出すことなく特定の領域をドリルダウンできます。
個人的には$REQUEST_URI
サーバーのディスク上の場所ではなく、入力されたURIを参照するため。
オーディンの答えに追加することはほとんどありません。 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_NAME
とSCRIPT_FILENAME
の間にはまったく接続がありません。
URLパス[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
の定義時にエイリアスが解決されないことは完全に正確ではありません。エイリアスはファイルシステムを検索すると見なされ、Odinの回答の例4から、ファイルシステムがファイルが存在するが、これはファイルが見つからない場合にのみ関係します。同様に、mod_dirはmod_aliasを呼び出してファイルシステムを検索しますが、これはAlias \index.php \var\www\index.php
などのエイリアスがあり、リクエストuriがディレクトリである場合にのみ関連します。
どの変数が何をするかを忘れた場合、 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
を呼び出します