如何在不翻译百分比字符的情况下提取本身作为URL参数传递的URL?

时间:2011-09-06 05:29:19

标签: php

我将URL作为URL参数传递,如下所示:

  

save_deal.php URL = HTTP:?//my.angieslist.com/thebigdeal/default.aspx的itemid =%2bTZi%2bk0M5%2B8%3D&安培;用户= 1965

save_deal.php中,我非常简单地访问url参数:

$url = $_GET["url"]; 

$url的价值是

  

http://my.angieslist.com/thebigdeal/default.aspx?itemid= TZi k0M5 8 =

即,奇怪的%2b和其他此类百分比字符已转换为其他字符。如何获得完全相同的字符串而不是此翻译版本(已将百分比字符转换为其他内容)?

2 个答案:

答案 0 :(得分:2)

你的问题是,当作为查询字符串参数传递时,URL应该再次编码,使itemid值编码两次 - 一次作为angieslist的参数,而不是作为整个URL的一部分(它本身就是一个查询)字符串参数)。

为了更清楚,创建URL的代码应该类似于:

<?php
$itemid = '+TZi+k0M5+8=';
$angieslist_url = 'http://my.angieslist.com/thebigdeal/default.aspx?itemid=' . urlencode($itemid);
// First of all, the itemid is encoded when passed as a query string argument, resulting in:
// http://my.angieslist.com/thebigdeal/default.aspx?itemid=%2bTZi%2bk0M5%2b8%3d


$savedeal_url = 'save_deal.php?url=' . urlencode($angieslist_url);    
// Here, the entire URL is used as an query string argument, which means it should be encoded just like any other argument, resulting in:
// save_deal.php?url=http%3A%2F%2Fmy.angieslist.com%2Fthebigdeal%2Fdefault.aspx%3Fitemid%3D%252BTZi%252Bk0M5%252B8%253D

您的HTTP服务器将负责将查询字符串参数解码回纯文本,这意味着当您阅读$_GET['url']时,您将无法获得完全编码的URL - 编码的一个“层”将是剥离,产生正确的网址 - http://my.angieslist.com/thebigdeal/default.aspx?itemid=%2bTZi%2bk0M5%2b8%3d

答案 1 :(得分:2)

$ _ GET将始终包含规范化和分割值。您可以使用以下命令从QUERY_STRING恢复原始参数:

$url = substr(strstr($_SERVER["QUERY_STRING"], "url="), 4);

正则表达式会更可靠,只有当?url =参数确实存在且没有其他真实参数时才会有效。