REQUEST_URI vs SCRIPT_NAME vs PATH_INFO vs PHP_SELF

6 Cevap http

Ben CodeIgniter'daki bir PHP uygulama inşa ediyorum. CodeIgniter Ana kontrolör tüm istekleri gönderir: index.php. Ancak, URI index.php görmek için sevmiyorum. Örneğin, http://www.example.com/faq/whatever şuna yol http://www.example.com/index.php/faq/whatever. Ben o adresi ne olduğunu bilmek bir komut dosyası için güvenilir bir yol gerekir, bu yüzden navigasyon ile ne bilecek. Ben CodeIgniter belgelerine göre, mod_rewrite kullandım.

Aşağıdaki gibi kural şudur:

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

Normalde, ben sadece php_self denetlemek, ancak bu durumda her zaman index.php bulunuyor. Ben, vb REQUEST_URI, PATH_INFO elde edebilirsiniz, ama ben en güvenilir olacak karar vermeye çalışıyorum. Herkes biliyor (ya da nerede bulacağını biliyorum) PHP_SELF, PATH_INFO, SCRIPT_NAME arasındaki gerçek fark, mu ve REQUEST_URI? Yardımlarınız için teşekkürler!

Note: SO çizgi görür, ve nedense italik yapar gibi, boşluk eklemek zorunda kaldım.

Updated: boşluk düzeltildi.

6 Cevap

PHP documentation farkı söyleyebilir:

'PHP_SELF'

Belge kök dizinine göreli Geçerli betiğin dosya,. Örneğin, $_SERVER['PHP_SELF'] adreste bir komut http://example.com/test.php/foo.bar olur /test.php/foo.bar. __FILE__ sabiti tam yolunu ve dosya (yani dahil) akım dosya adını içerir. PHP komut satırı işlemcisi olarak çalışıyorsa bu değişken PHP 4.3.0 betik adını içerir. Daha önce mevcut değildi.

'SCRIPT_NAME'

Geçerli betiğin yolunu içerir. Bu kendileri için göstermesi gereken sayfalar için yararlıdır. __FILE__ sabiti tam yolunu ve dosya (yani dahil) akım dosya adını içerir.

'REQUEST_URI'

Bu sayfaya erişmek için verilen URI; Örneğin, '/index.html'.

PATH_INFO'yu belgelenmiş görünmüyor ...

Some practical examples of the differences between theese variables:
Example 1. PHP_SELF is different from SCRIPT_NAME only when requested url is in form:
http://example.com/test.php/foo/bar

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

(this seems to be the only case when PATH_INFO contains sensible information [PATH_INFO] => /foo/bar) Note: this used to be different in some older PHP versions (<= 5.0 ?).

Example 2. REQUEST_URI is different from SCRIPT_NAME when a non-empty query string is entered:
http://example.com/test.php?foo=bar

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

Example 3. REQUEST_URI is different from SCRIPT_NAME when server-side redirecton is in effect (for example mod_rewrite on apache):

http://example.com/test.php

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

Example 4. REQUEST_URI is different from SCRIPT_NAME when handling HTTP errors with scripts.
Using apache directive ErrorDocument 404 /404error.php
http://example.com/test.php

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

On IIS server using custom error pages
http://example.com/test.php

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

Böyle htaccess kullanırken PATH_INFO kullanılabilir:

Example 1

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

Remains the same

[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] => 

Path

http://domain.com/test

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

Query String

http://domain.com/test?123

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

Example 2

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

Remains the same

[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] => 

Path

http://domain.com/test

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

Query String

http://domain.com/test?123

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

Example 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]

veya

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]

Remains the same

[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

Path

http://domain.com/test

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

Language

http://domain.com/en

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

Language path

http://domain.com/en/test

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

Language Query string

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

Sen URI Class içine bakmak ve $ this-> uri-> uri_string faydalanmak () isteyebilirsiniz

Tam URI ile bir dize döndürür.

Örneğin, bu tam URL ise:

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

Işlevi, bu dönecekti:

/news/local/345

Yoksa ayrıştırma / regex değerleri ile gelmek zorunda kalmadan belirli alanlarda detaya kesimleri faydalanmak olabilir

Bu URI sunucunun disk üzerindeki konumunu girmemiş ve başvuran gibi Şahsen ben $ REQUEST_URI kullanın.

Yedekleme ikinci, sizinle başlamak için yanlış bir yaklaşım aldım. Neden sadece bunu değil

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

yerine? Sonra $_GET['url']; ile yakala