【问题标题】:Encoding $_GET variable URL ignores ampersand "&" character编码 $_GET 变量 URL 会忽略与号“&”字符
【发布时间】:2012-07-28 04:37:38
【问题描述】:

所以我试图从地址栏中获取一个如下所示的 url:

http://mysite.com/url.php?name=http://test.com/format.jsp?id=738ths3&secure=false

我正在使用 $_GET 变量从 URL 中读取它,我的代码如下

$arc = rawurlencode($_GET['name']);
echo "URL: $arc";

这只返回

URL: http://imgur.com/format.jsp?id=738ths3

它缺少 &secure=false

我想要它的样子:

 URL: http://test.com/format.jsp?id=738ths3&secure=false

我尝试了 urlencode,rawurlencode 无济于事,我在 google 中查看了许多论坛和 stackoverflow 没有答案帮助,有什么想法吗?谢谢!

urlencode 显示:

网址:http%3A%2F%2Ftest.com

所以我也不能拥有它!

【问题讨论】:

  • 您在这里看到的问题是 name 是 GET 参数之一,而 secure 是另一个。因此,您的请求必须在作为请求发送之前进行原始编码,而不是之后。

标签: php url get


【解决方案1】:

你需要urlencode()在构造URL之前,即:

$url = "http://mysite.com/url.php?name=".urlencode('http://test.com/format.jsp?id=738ths3&secure=false');

这样,您将能够从$_GET['name'] 获取完整的URL 作为name GET 参数。

说明:

没有urlencode()在构造URL时,PHP会把它当作2个单独的参数,用&隔开:

  1. $_GET['name']
    你的情况是http://imgur.com/format.jsp?id=738ths3

  2. $_GET['secure']
    你的情况是false

或者:

根据您的评论,您似乎无法控制 URL 的构建。您可以使用 http_build_query 在单个字符串中获取完整的 $_GET

$name = http_build_query($_GET);

你会得到:

echo $name; // name=http://test.com/format.jsp?id=738ths3&secure=false

// which you would then may want to strip away the first 'name='
$name = substr($name, strlen('name='));

echo $name; // to obtain http://test.com/format.jsp?id=738ths3&secure=false

【讨论】:

  • 如何从地址栏获取 url 并将其输入到 .urlencode() 中?不使用 &_GET?
  • 如果你构建了 URL,你应该正确地构建它。否则,您可以获得 2 个单独的 $_GET 参数并将它们粘回去。
  • 编辑了我的答案以展示如何使用 http_build_query() 获取单个字符串中的所有参数。
  • 您也可以使用$_SERVER['QUERY_STRING'] 而不是parse_url(),因为您将其视为字符串而不是数组。
  • 在修改了我的代码几个小时之后,(我是 php 和编程的新手),我意识到我确实可以控制 URL 构造!我在施工过程中做了第一步和 urlencode 并且它有效!非常感谢你
【解决方案2】:

原始 URL http://mysite.com/url.php?name=http://test.com/format.jsp?id=738ths3&secure=false 包含两个查询字符串参数:namesecure。查询字符串中的& 属于完整 URL,而不是name 参数中的URL。

如果你对这个值有控制权,在声明链接/URL时,使用PHP的urlencode()编码全名值,如:

$url = "http://mysite.com/url.php?name=" . urlencode("=http://test.com/format.jsp?id=738ths3&secure=false");

这将正确编码name 参数,您的$arc = $_GET['name']; 将按需要工作。

如果您无法控制设置值并且只是解析您收到的内容,您可以在name= 参数上拆分给定字符串,并假设它是name 的一部分之后的所有其他内容:

$splitQuery = split('name=', $_SERVER['REQUEST_URI']);
$arc = $splitQuery[1];

要解码编码的 URL,在你访问它之后,使用 PHP 的urldecode():

$arc = urldecode($_GET['name']); // assuming you're properly encoding the `name` parameter

【讨论】:

    【解决方案3】:

    如果无法对 URL 进行编码,则可以使用以下代码获取当前 URI:

    $url = $_SERVER["REQUEST_URI"];
    

    在你的情况下,$url 是:

    /url.php?name=http://test.com/format.jsp?id=738ths3&secure=false
    

    然后你可以用explode拆分它并验证它并从中获取GET参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2011-08-06
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多