我有一个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']返回完全相同的字符串.那么,有什么区别?我该如何在它们之间做出选择?
区别
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)
找出一个区别
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)