为啥有些 PHP 安装有 $_SERVER['SCRIPT_URI'] 而其他没有?

Posted

技术标签:

【中文标题】为啥有些 PHP 安装有 $_SERVER[\'SCRIPT_URI\'] 而其他没有?【英文标题】:Why do some PHP installations have $_SERVER['SCRIPT_URI'] and others not?为什么有些 PHP 安装有 $_SERVER['SCRIPT_URI'] 而其他没有? 【发布时间】:2012-01-13 23:10:02 【问题描述】:

我运行两台 Apache 2 服务器。一个有 php5.2,另一个有 PHP5.3。 5.3机器上有$_SERVER['SCRIPT_URI']是有原因的吗?

这个变量从何而来?这显然是来自 Apache 环境的东西,并且没有记录在 PHP 手册中。然而,它是['HTTPS']['SERVER_NAME']['REQUEST_URI'] 组合的便捷捷径。

我尝试过查看配置文件、搜索 SO 和网络。

【问题讨论】:

我假设您的意思是“另一个有 5.3”?至于你的问题,对不起,我不确定。远射,但您看过 apache2 文档吗? AFAIK 中 $_SERVER[] 全局中可用的很多内容是由服务器本身决定的。奇怪的是手册没有记录它...... 5.3 已经发布了一段时间了,不是吗? 谢谢我已经修复了那个版本号! 【参考方案1】:

根据post on WebHostingTalk,它来自mod_rewrite:

添加

RewriteEngine On

到你的 httpd.conf 文件中你想打开这个的虚拟主机 on for 然后重启 apache。

【讨论】:

不,那没有成功。重写引擎在我的系统上,我的网页在虚拟主机内。但是还是没用。 这对我有用。我必须在网站的 http 配置文件中设置它。【参考方案2】:

我使用 Plesk12、PHP 5.6.6 迁移到 CentOS 7 并重写等。 SCRIPT_URI 不存在。 因为它在某些情况下使用起来非常好,所以我写了这个解决方法:

if(!isset($_SERVER['SCRIPT_URI']))
    $_SERVER['SCRIPT_URI'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

    $pos = strrpos($_SERVER['SCRIPT_URI'],'/');
    if($pos!==false) 
        $_SERVER['SCRIPT_URI'] = substr($_SERVER['SCRIPT_URI'], 0, $pos+1);
    

由于我不是专家,请在插入之前检查此代码是否适用于您的特定应用程序。在我的系统上,它似乎运行良好。我只是把它放在我的 index.php 和其他的 Head-Area 中。

【讨论】:

【参考方案3】:

据我所知,$_SERVER['SCRIPT_URI'] 仅在您将 PHP 作为 CGI 运行时可用。我想这一定是你的两个 PHP 安装的区别。

【讨论】:

我的服务器设置了 SCRIPT_URI,但是 php_sapi_name() 报告了 apache2handler。 (在 Fedora 18 上使用 PHP 5.4 和 Apache 2.4 的 mod_php) 这对我来说不是真的:我使用 PHP 作为 mod_php 并且它定义了 SCRIPT_URI。

以上是关于为啥有些 PHP 安装有 $_SERVER['SCRIPT_URI'] 而其他没有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用 PHP 的 $_SERVER 变量得到一个随机字符串作为 IP 地址?

为啥是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用?

PHP中为啥我获取不到$_SERVER["REMOTE_USER"]的值?

使用 SC 排序规则的 SQL Server Unicode 查询

我想问下为啥在写php程序中,有些html直接写,有些却通过echo来写html?

我需要安装啥模块才能在 $_SERVER 数组中查看我的标头变量?