113

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

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

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_SELFPATH_INFOSCRIPT_NAME、およびの本当の違いを知っている人はいますか (または場所を知っていますか) REQUEST_URI。ご協力いただきありがとうございます!

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

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

4

9 に答える 9

246

これらの変数の違いのいくつかの実用的な例:例1. PHP_SELFは、要求されたURLが次の形式である場合にのみ
SCRIPT_NAMEと異なります: 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.サーバー側のリダイレクトが有効な場合(たとえば、apacheのmod_rewrite)、REQUEST_URIはSCRIPT_NAMEとは異なります。

http://example.com/test.php

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

例4.スクリプトでHTTPエラーを処理する場合、REQUEST_URIはSCRIPT_NAMEとは異なります。
Apacheディレクティブの使用ErrorDocument404/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
于 2008-11-28T17:59:46.520 に答える
54

PHPのドキュメントで違いがわかります。

'PHP_SELF'

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

'SCRIPT_NAME'

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

'REQUEST_URI'

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

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

于 2008-11-11T05:14:31.693 に答える
25

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

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?123

[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)

http://domain.com/

[REQUEST_URI]  => /
[QUERY_STRING] => 

http://domain.com/test

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

クエリ文字列

http://domain.com/test?123

[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

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?123

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test?123
[QUERY_STRING]      => 123
[REDIRECT_LANGUAGE] => en
于 2012-03-07T11:22:58.917 に答える
5

URI クラスを調べて、$this->uri->uri_string() を利用することをお勧めします。

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

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

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

関数はこれを返します:

/news/local/345

または、セグメントを利用して、解析/正規表現の値を考え出すことなく、特定の領域を掘り下げることができます

于 2008-11-11T05:09:02.250 に答える
4

オーディンの答えに追加することはほとんどありません。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 の書き換え、または何らかの形式の URL 書き換えがない場合は、

REQUEST_URI = PHP_SELF + ? + QUERY_STRING 

エイリアスは、以前に定義された URL パスではなく、システム ファイル パスに影響しSCRIPT_FILENAMEます__FILE__。以下の例外を参照してください。エイリアスは、PATH_INFO. と の間にはまったく接続がない可能性がありSCRIPT_NAMEますSCRIPT_FILENAME

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

于 2015-12-16T04:34:11.947 に答える
4

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

于 2008-11-11T04:17:09.733 に答える
-1

ちょっとバックアップしてください、あなたは最初に間違ったアプローチを取りました。なぜこれをしないのですか

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

代わりは?次に、それをつかみます$_GET['url'];

于 2008-12-28T02:00:57.560 に答える