我尝试将网址作为查询字符串传递,以便其他网站可以阅读,然后使用:
www.example.com/domain?return_url=/another/domain
获取返回:
www.example.com/domain?return_url=%2Fanother%2Fdomain
是否有其他应用程序可以使用转义字符读取和解析此URL?
我能想到的唯一方法是以某种方式对其进行编码,因此它就像这样:
www.example.com/domain?return_url=L2Fub3RoZXIvZG9tYWlu
然后其他应用程序可以解码并使用?
答案 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.pm或Plack)就可以做到这一点。你不应该关心它。
要对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编码。 URI
和URI::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