我正在寻找一种便携方式来接收(方便的)$_SERVER['PATH_INFO']
变量。
看了一会儿,发现 PATH_INFO
源自 CGI/1.1,我并不总是出现在所有配置中。
获取该变量的最佳(主要是安全方面)方法是什么 - 除了手动提取它(安全问题)。
最佳答案
好吧,我(几乎)确定如果不使用 $_SERVER
超全局键,提供另一种方法来找出 PATH_INFO
是不可能的,那被说lets first list all of the $_SERVER keys我们可能可能使用:
- 'PHP_SELF'
- “QUERY_STRING”
- 'SCRIPT_FILENAME'
- 'PATH_TRANSLATED'
- 'SCRIPT_NAME'
- 'REQUEST_URI'
- 'PATH_INFO'
- 'ORIG_PATH_INFO'
我们显然需要忽略最后两个。现在我们应该(我不知道这个事实,我只是假设因为你这么说)过滤你提供的链接中存在的所有键(which BTW is offline ATM),留下我们使用以下键:
- 'PHP_SELF'
- 'SCRIPT_FILENAME'
- 'REQUEST_URI'
关于您对 Anthonys answer 的评论:
You are just juggling variables now.
SCRIPT_FILENAME
is a part of the CGI spec. It will not be available ifPATH_INFO
is unavailable. As forREQUEST_URI
, it's apache's mod_rewrite specific. – LiraNuna
我正在运行 LightTPD/1.4.20-1 (Win32),PHP 5.3.0 作为 CGI,cgi.fix_pathinfo = 1
和 $_SERVER['REQUEST_URI' ]
对我来说非常有用,我还记得在没有人使用 mod_rewrite
的日子里使用过相同的变量,所以我诚实谦虚的猜测是你'在这一点上显然是错误的。关于 SCRIPT_FILENAME
key ,我无法在 ATM 上测试该 key 。尽管如此,如果我们非常努力地闭上眼睛并相信您是对的,那么我们只剩下一个变量:
- 'PHP_SELF'
我并不想在这里变得苛刻(而且我仍然相信有更多的解决方案)但是如果 PHP_SELF
是您希望我们使用的唯一 key (假设有PHP_SELF
本身没有强加)只剩下一个解决方案:
function PATH_INFO()
{
if (array_key_exists('PATH_INFO', $_SERVER) === true)
{
return $_SERVER['PATH_INFO'];
}
$whatToUse = basename(__FILE__); // see below
return substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'], $whatToUse) + strlen($whatToUse));
}
此函数应该可以工作,但是使用__FILE__
常量可能会出现一些问题,因为它返 echo 明__FILE__
常量的文件的路径,并且不是请求的 PHP 脚本的路径,所以这就是 $whatToUse 存在的原因:所以你可以用 'SCRIPT_FILENAME'
替换它,或者如果你真的相信你所说的,只需使用 '.php'
。
您还应该 read this regarding why not to use PHP_SELF
.
如果这对你不起作用,我很抱歉,但我能想到其他的。
编辑 - 为您阅读更多内容:
- Drupal request_uri() (为什么他们一直说
REQUEST_URI
是特定于 Apache 的?) -
PHP_SELF
vsPATH_INFO
vsSCRIPT_NAME
vsREQUEST_URI
关于php - 获取 PATH_INFO 的便携且安全的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1884041/