4

所以这就是事情,我正在构建需要根据请求 URI 调度 http 请求的调度程序类,所以我只对域后面的部分 URI 感兴趣。

现在,当我像这样在 URI 上的实时服务器上工作时:

www.domain.com/controller/method/params/

REQUEST_URI 将返回:

/controller/method/params/

但是当我在本地机器上工作时,我有这样的 URI:

localhost/project/controller/method/params/

并且 REQUEST_URI 将返回:

/project/controller/method/params/

那么有没有一种优雅而简洁的方法来告诉 php 只从 URI 中获取我需要的参数?它必须是 $_SERVER['REQUEST_URI'],但我需要在实时服务器和本地服务器上使用相同的字符串?

谢谢!

Dispatcher 将当前请求 URI 与配置文件中定义的 URI 进行比较。在实时服务器上它匹配,但在本地机器上比实时服务器上多一个段。

我该怎么办?

4

4 回答 4

3

通常我将本地网络服务器配置为响应“test.mysite.com”,并在主机文件中将 test.mysite.com 设置为 127.0.0.1,这样我可以更好地模拟生产环境,并且我不会被迫使用子路径在网址中

如果你使用 apache webserver,你可以简单地设置 N 个虚拟主机。

于 2012-04-11T16:25:19.030 回答
1

如果存在,您可以简单地从 URL 的开头删除路径。

$path = '/project/'; // for localhost/project/controller/method/params/
//$path = '/';       // for domain.tld/controller/method/params/

$url = getenv('REQUEST_URI');
if(strpos($url, $path) === 0)
{
    $url = str_replace($path, '', $url, 1);
}
print $url;

我还没有测试过上面的代码,所以杂散的“/”可能会搞砸。如果需要,您可以随时使用类似的东西修剪 URL $url = trim($url, '/')

于 2012-04-11T17:00:05.700 回答
0
$url = $_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'];

那是你要的吗?

于 2012-04-11T16:33:16.790 回答
0

如果检测到 localhost ,我使用内置的array_shift()函数。

if ($_SERVER['HTTP_HOST'] == 'localhost') {
    $array_uri = explode('/', $_SERVER['REQUEST_URI']);
    array_shift($array_uri);
    $uri = $array_uri;
} else {
    $uri = explode('/', $_SERVER['REQUEST_URI']);
}
于 2016-09-15T21:17:31.243 回答