Perl:在查询字符串

时间:2017-02-02 13:48:30

标签: perl url

我尝试将网址作为查询字符串传递,以便其他网站可以阅读,然后使用:

www.example.com/domain?return_url=/another/domain

获取返回:

www.example.com/domain?return_url=%2Fanother%2Fdomain

是否有其他应用程序可以使用转义字符读取和解析此URL?

我能想到的唯一方法是以某种方式对其进行编码,因此它就像这样:

www.example.com/domain?return_url=L2Fub3RoZXIvZG9tYWlu

然后其他应用程序可以解码并使用?

https://www.base64encode.org/

2 个答案:

答案 0 :(得分:5)

  

www.example.com/domain?return_url=%2Fanother%2Fdomain

这称为URL encoding。不是因为你在其中放了一个URL,而是因为它对URL中具有特殊含义的字符进行编码。

%2F对应斜线/。您之前可能还看到了%20,这是一个空格

将完整的URI放入另一个URI的URL参数中是完全没问题的。

http://example.org?url=http%3A%2F%2Fexample.org%2Ffoo%3Fbar%3Dbaz

您正在调用的URL背后的应用程序需要能够理解URL编码,但这是一件微不足道的事情。典型的Web框架和Web界面(如Perl中的CGI.pmPlack)就可以做到这一点。你不应该关心它。

要对Perl中的内容进行URL编码,您有几种选择。

您可以使用URI模块创建整个URI,包括URL编码查询。

use URI;

my $u = URI->new("http://example.org");
$u->query_form( return_url => "http://example.org/foo/bar?baz=qrr");

print $u;

__END__
http://example.org?return_url=http%3A%2F%2Fexample.org%2Ffoo%2Fbar%3Fbaz%3Dqrr

这似乎是很自然的事情。

您还可以使用URI::Encode模块,它会为您提供uri_encode功能。如果你想在不构建URI对象的情况下编码字符串,这很有用。

use URI::Encode qw(uri_encode uri_decode);
my $encoded = uri_encode($data);
my $decoded = uri_decode($encoded);

所有这些都是网络运作的正常部分。无需进行Base 64编码。

答案 1 :(得分:4)

正确的方法是像第一个例子中那样对第二跳进行uri编码。 URIURI::QueryParam模块使这很简单:

要对URI进行编码,只需在基本网址上创建一个URI对象即可。然后添加所需的任何查询参数。 (注意:它们将由URI::QueryParam)自动进行uri编码:

use strict;
use warnings;

use feature qw(say);

use URI;
use URI::QueryParam;

my $u = URI->new('http://www.example.com/domain');
$u->query_param_append('return_url', 'http://yahoo.com');

say $u->as_string;
# http://www.example.com/domain?return_url=http%3A%2F%2Fyahoo.com

要接收此网址,然后重定向到return_url,您只需创建一个新的URI对象,然后使用return_url提取URI::QueryParam查询参数。 (注意:再次URI :: QueryParam自动为您解析参数):

my $u = URI->new(
  'http://www.example.com/domain?return_url=http%3A%2F%2Fyahoo.com'
);
my $return_url = $u->query_param('return_url');

say $return_url;
# http://yahoo.com