【问题标题】:PHP GET variable `/` instead of `?`PHP GET 变量 `/` 而不是 `?`
【发布时间】:2011-11-30 03:16:44
【问题描述】:

我正在使用一个不允许在 URL 中使用 $_GET[] 变量的脚本(这是我给出的引荐来源网址,我需要一些方法来跟踪它)。我不能拥有这个,例如domain.com/index.php?id=test。但是我可以做到这一点domain.com/index.php/idd=test

我的问题是我是否使用 / 而不是 ? 并将其视为 get 变量。如何从 url 获取变量。有什么简单的方法来做到这一点

【问题讨论】:

  • 查找mod_rewrite方法。
  • 首先想到的是使用 POST 而不是 GET?第二个想法是使用 $_SERVER['REQUEST_URI'] 并进行一些创造性的解析? -- 编辑 -- 或者如果你可以使用 mod_rewrite,那么 @BradChristie 的建议。
  • 我不认为 $_POST 是一个可行的选择。如果他的意思是 somedomain.com/index/category/id
  • 我需要使用get。这是我给出的引荐来源网址,我需要有一些方法来跟踪它。发帖无效

标签: php variables get


【解决方案1】:

如果你有这样的网址:

http://example.com/index.php/whatever

那么/whatever 通常被称为PATH_INFO 并且可以作为:

print $_SERVER["PATH_INFO"]

请注意,当实际 path_info 不存在时,某些环境 (CGI) 可以将其设置为占位符值 (request_uri)。 (另请参阅关于环境变量http://php.net/manual/en/reserved.variables.server.php 的 PHP 手册以及关于 PATH_INFO 和 PATH_TRANSLATED 的注释。)

.htaccess: php_value arg_separator.input &;/
# Else strtr(..., "/", "&")

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

应该填充 $_GET。

【讨论】:

  • 我有点尴尬,我不知道PATH_INFO。太棒了
  • 学到了一些新东西。谢谢。
【解决方案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'],方法是在“/”上拆分,循环遍历该数组并在“=”上拆分(假设您仍将使用 key=value 结构)。

但是请注意,不稳定的 URL 结构的副作用是文档中的相对链接将变得相对于不稳定的 URL,所以像

这样的图像

<img src="images/myimage.jpg">

将尝试加载http://www.example.com/index.php/foo/bar/images/myimage.jpg

这可以通过使用绝对 URL (http://www.example.com/images/myimage.jpg) 或根相对 URL (/images/myimage.jpg) 来避免。

但基本上,您是在自找麻烦……和故障排除。

【讨论】:

    【解决方案3】:
    $segments = explode("/", $_SERVER['REQUEST_URI']);
    

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

    不过,您绝对应该研究一下 mod_rewrite。您需要将调用重定向到文件,因为如果您不允许获取 vars,则此方法将不允许 .php 之后的任何内容。 (假设通过一些配置?及以后没有被读取)

    如果那是您的一个控制器,基本上将所有内容重新路由到 index.php。

    【讨论】:

      【解决方案4】:

      你可以这样解析:

      $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'] 中,所以我知道有一个变量可以使用
      • 我想这取决于你,因为你会提供推荐链接,对吧?
      【解决方案5】:

      你要做的是解析$_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]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多