$ _SERVER ['PHP_SELF']和$ _SERVER ['SCRIPT_NAME']有什么区别?

Hug*_*ota 10 php apache

我有一个PHP框架,我用来$_SERVER['SCRIPT_NAME']优化可移植性.这样我就不需要再手动配置路径了.

$this->base_url = str_replace('index.php', '', 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']);
Run Code Online (Sandbox Code Playgroud)

但我注意到$_SERVER['SCRIPT_NAME']$_SERVER['PHP_SELF']返回完全相同的字符串.那么,有什么区别?我该如何在它们之间做出选择?

gen*_*sis 9

区别

http://sandbox.phpcode.eu/g/3e38d.php/test
Run Code Online (Sandbox Code Playgroud)

脚本名称是文件的绝对路径.

PHP_SELF是您目前所在的脚本(以及之后的"路径" .php)

就像$_SERVER['SERVER_NAME']$_SERVER['HTTP_HOST']

http://sandbox.phpcode.eu./g/f5093.php

http://sandbox.phpcode.eu/g/f5093.php
Run Code Online (Sandbox Code Playgroud)

找出一个区别


Igo*_*vas 7

SCRIPT_NAME
Run Code Online (Sandbox Code Playgroud)

包含当前脚本的路径.这对需要指向自己的页面很有用.该__FILE__常量包含当前的完整路径和文件名(例如包含文件).

PHP_SELF
Run Code Online (Sandbox Code Playgroud)

当前正在执行的脚本的文件名,相对于文档根目录.举例来说,$_SERVER['PHP_SELF']在地址脚本http://example.com/test.php/foo.bar/test.php/foo.bar.该__FILE__常量包含当前的完整路径和文件名(例如包含文件).如果PHP作为命令行处理器运行,则此变量包含自PHP 4.3.0以来的脚本名称.以前它不可用.

源码php.net

有一件事:

查看 http://www.yoursite.com/example/index.php/dir/test

$_SERVER['PHP_SELF'] == '/example/index.php/dir/test';

$_SERVER['SCRIPT_NAME'] == '/example/index.php';

ETA:试过自己

在localhost http://127.0.0.1:8887/index.php/dir/test上试过这个

echo $_SERVER['PHP_SELF'] . "<br />";
echo $_SERVER['SCRIPT_NAME'];
Run Code Online (Sandbox Code Playgroud)

输出是:

/index.php/dir/test 
/index.php
Run Code Online (Sandbox Code Playgroud)