在PHP中,GET变量可以使用斜杠“/”代替问号“?”。

3
我正在处理一个脚本,它不允许在URL中使用$_GET[]变量(我正在提供一个引荐URL,并且需要有一种追踪方式)。例如,我不能这样做:domain.com/index.php?id=test。但是我可以这样做:domain.com/index.php/idd=test
我的问题是,如果我使用/代替?并将其视为get变量,那么如何从URL中获取变量?有什么简单的方法可以做到这一点?

查找 mod_rewrite 方法。 - Brad Christie
首先想到的是使用POST而不是GET?其次是使用$_SERVER['REQUEST_URI']并进行一些创造性的解析?--编辑--或者如果您可以使用mod_rewrite,那么就像@BradChristie建议的那样。 - favoretti
我认为$_POST不是一个可行的选项。如果他的意思是类似somedomain.com/index/category/id这样的东西,那怎么办? - Kai Qing
我需要使用get。这是一个我要提供的引荐网址,我需要有一些方式来跟踪它。Post不起作用。 - Pinkie
5个回答

4
如果您有这样的URL:
http://example.com/index.php/whatever

然后/whatever通常被称为PATH_INFO,并且可以通过以下方式访问:

print $_SERVER["PATH_INFO"]

请注意,某些环境(如CGI)在实际的path_info不存在时,可能会将其设置为占位符值(request_uri)。 (还请参阅PHP手册中关于环境变量的说明 http://php.net/manual/en/reserved.variables.server.php,以及有关PATH_INFO和PATH_TRANSLATED的说明。)
.htaccess: php_value arg_separator.input &;/
# Else strtr(..., "/", "&")

parse_str($_SERVER["PATH_INFO"], $_GET);

应该填充 $_GET。


我有点尴尬,我不知道PATH_INFO。太棒了。 - Yes Barry
1
学到了新东西。谢谢。 - Pinkie

2

替换整个$_GET参数的功能并没有“简单”方法,但至少在Apache下有一些笨拙的解决方案。鉴于您无法使用$_GET参数,我假设您也不能访问mod_rewrite,但谁知道呢。

http://www.example.com/index.php/foo/bar/baz这样的请求会在$_SERVER超全局变量中生成以下项目:

[REQUEST_URI] => /index.php/foo/bar/baz
[SCRIPT_NAME] => /index.php
[PATH_INFO] => /foo/bar/baz

理论上,您可以通过在“ / ”上拆分 $_SERVER['PATH_INFO'],循环遍历该数组并在“ = ”上拆分(假设您仍将使用键=值结构)来解析它。
但是,请注意,奇怪的URL结构的副作用是,文档中的相对链接将变为相对于奇怪的URL,因此像这样的图像: 将尝试加载http://www.example.com/index.php/foo/bar/images/myimage.jpg
可以通过使用绝对URL(http://www.example.com/images/myimage.jpg)或根相对URL(/images/myimage.jpg)来避免这种情况。
但基本上,您正在请求一堆麻烦...和故障排除。

1
$segments = explode("/", $_SERVER['REQUEST_URI']);

然后你可以从那里决定。$segments 中的每个结果都可以以相同的方式进行操作。例如,您可以选择 id=test 或只是 id,并始终知道 $segments[2] 是 id。这取决于您。

但您应该确实研究一下 mod_rewrite。如果您不能使用 get 变量,则需要重定向到文件,否则此方法将不允许 .php 之后的任何内容。(假设通过某些配置?而且超出范围也无法读取)

基本上,如果 index.php 是您的唯一控制器,请将所有内容重定向到 index.php。


1
你可以像这样解析它:
$uriParts = array_reverse((array) explode('/', $_SERVER['REQUEST_URI']));
$GET = explode('=', $uriParts[0]); // however you wanted to parse it form here

随你所愿,只需知道$uriParts[0]将包含id=whatever


我需要检查 $_SERVER['REQUEST_URI'] 中是否存在 =,以便知道是否有变量可用于操作吗? - Pinkie
1
我猜这取决于你,因为你将提供推荐链接,对吧? - Kai Qing

1
你需要做的是解析$_SERVER['REQUEST_URI'],然后根据需要进行操作。
从你的示例中可以看出,你需要像这样做:
//get rid of "/index.php
$uri = substr($_SERVER['REQUEST_URI'], 11);
//explode incase there are other parameters
$arr = explode('&', $uri);
$token = array();
foreach($token as $t){
    $part = explode('=', $t);
    $token[$part[0]] = $part[1]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接