【问题标题】:$_SERVER['REQUEST_URI'] returns full URL instead of path to script$_SERVER['REQUEST_URI'] 返回完整 URL 而不是脚本路径
【发布时间】:2014-10-05 06:00:56
【问题描述】:

我的 PHP 应用程序无法运行,因为 $_SERVER['REQUEST_URI'] 返回脚本的完整 url 而不是相对路径。

我的环境:
Windows 7 64 位。
XAMPP 版本 1.8.2
PHP 版本 5.4.16
Apache 版本 Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.16

我的虚拟主机会议:

<VirtualHost *:80>
DocumentRoot "D:/HTDOCS/ivankristianto"
ServerName www.ivankristianto.local
UseCanonicalName Off
<Directory "D:/HTDOCS/ivankristianto">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
    Require all granted
</Directory>
</VirtualHost>

我创建了一个基本脚本来测试 $_SERVER 内容:

echo '$_SERVER[\'HTTP_HOST\'] : ' . $_SERVER['HTTP_HOST'];
echo '<br/>' . '$_SERVER[\'PHP_SELF\'] : ' . $_SERVER['PHP_SELF'];
echo '<br/>' . '$_SERVER[\'REQUEST_URI\'] : ' . $_SERVER['REQUEST_URI'];

结果如下:

// URL: http://localhost/ivankristianto/request.php
$_SERVER['HTTP_HOST'] : localhost
$_SERVER['PHP_SELF'] : /ivankristianto/request.php
$_SERVER['REQUEST_URI'] : /ivankristianto/request.php //This is correct

// URL: http://www.ivankristianto.local/request.php
$_SERVER['HTTP_HOST'] : www.ivankristianto.local
$_SERVER['PHP_SELF'] : /request.php
$_SERVER['REQUEST_URI'] : http://www.ivankristianto.local/request.php  //This is wrong

我没有使用任何代理,我所做的只是将它设置在我的 /etc/hosts 中。

我花了几个小时找出为什么会发生这种情况,并通过谷歌和这个网站进行搜索,但找不到任何线索。

你能指出我出了什么问题吗?

谢谢。
伊万

【问题讨论】:

  • 嗨,我也有同样的问题,但仅在使用 Chrome 中的 USB Debug 访问手机上的本地虚拟主机时

标签: php apache request-uri


【解决方案1】:

我相信您正在收到创建虚拟主机的预期效果:

虚拟主机:

/ivankristianto/request.php 

使用虚拟主机:

http://www.ivankristianto.local/request.php

http://www.ivankristianto.local - 我认为这对您来说似乎是错误的,因为它包含 http://www.local - 您可以将其更改为仅 invankristano 并且您的 REQUEST_URI 将输出与您没有虚拟主机一样的输出.它表示您的 request.php 的路径 - 您已在 hosts 文件中设置,因此是 URI 的有效部分。

所以基本上我的意思是没有错。

如果它给您带来问题,那么一种解决方案是确定您所处的环境 - 例如

if($_SERVER['HTTP_HOST'] == 'www.ivankristianto.local') {
    $dev_env = TRUE;
}else {
    $dev_env = FALSE;
}

然后在某处使用它:

if($dev_env) {
    $_SERVER['REQUEST_URI'] = str_replace($_SERVER['HTTP_HOST'],'',$_SERVER['REQUEST_URI']);
}

更新

尝试将主机配置更改为:

<VirtualHost *:80>
DocumentRoot "D:/HTDOCS/ivankristianto"
ServerName ivankristianto.local
UseCanonicalName Off
<Directory "D:/HTDOCS/ivankristianto">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
    Require all granted
</Directory>
</VirtualHost>

(从服务器名称中删除 www.)

【讨论】:

  • 感谢 JohnnyFaldo 的回答。但是 REQUEST_URI 不应该返回完整的 URL,它应该返回类似这样的内容:'/request.php'。基于 PHP 文档:php.net/manual/en/reserved.variables.server.php
  • 这就是它正在做的事情。这就是我的意思——你对虚拟主机的“URL”语法感到困惑——如果你在主机文件中将它更改为没有 www. & .local - 那么它看起来就不那么奇怪了。它只是一个名称,它指代它在 hosts 文件中设置的 URI 的实际部分
  • @Ivan 你试过去掉 hosts 文件中的 UseCanonicalName 行吗
  • 是的,我确实删除了它并重试。但仍然没有运气。这很奇怪,也是我的第一次。 Request_uri 不应返回完整 URL。它应该返回脚本的相对路径。
  • @Ivan 将虚拟主机更改为不包括 wwww - 请参阅我的更新答案
【解决方案2】:

我终于让它工作了。
这是我所做的步骤(我不知道它为什么会受到影响,但它现在正在工作)。

  1. 在 xampp 上安装 PHP Fastcgi,我按照以下步骤操作:https://commaster.net/content/installing-php-fastcgi-and-zend-opcache-xampp-windows
  2. 我加载了 mod_fcgid,但我不使用 php-cgi.exe 处理程序
  3. 更新我的 /etc/hosts 文件并使用此命令 ipconfig /flushdns 刷新 dns
  4. 重启apache

它以某种方式工作。
老实说,我不知道它为什么会起作用,但如果有人遇到同样的问题,我希望解决方案可能会有所帮助。

【讨论】:

    【解决方案3】:

    最近遇到了同样的问题,
    我的解决方案:
    首先检查您的http://localhost 是否具有相同的效果。(我知道我没有)
    如果没有,则将您的虚拟主机(域)添加到 /etc/host 文件中。

    希望这有帮助。

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2018-08-30
      • 2018-05-23
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多