2012-07-09 70 views
2

在我的应用程序中,我需要获取任何URL的基本URL。到现在为止,我已经得到它像这样:获取URL的“基本URL”

$resp->base; 

$respHTTP::Response对象。然而,现在我需要知道URL的基地而没有实际上请求它们并得到一个HTTP::Response对象。有谁知道一种方法来做到这一点?

回答

3

您希望找到“.”扩展的绝对网址,相对于您拥有的网址。 URI可以做到这一点。

$ perl -MURI -E'say URI->new_abs(".", $_) for @ARGV' \ 
    'http://www.example.org/dir/' \ 
    'http://www.example.org/dir/file.html' \ 
    'http://www.example.org/dir/file.cgi?foo=bar' 
http://www.example.org/dir/ 
http://www.example.org/dir/ 
http://www.example.org/dir/ 
+0

so'URI-> new_abs(“。”,“http://www.example.org/dir/”);'返回一个字符串? – srchulo 2012-07-09 20:52:58

+1

它返回一个URI对象,但是URI对象会在需要的时候被自动字符串化为他们所代表的URI。您也可以使用' - > as_string' – ikegami 2012-07-09 20:54:09

+0

明确地将其字符串化,非常感谢! – srchulo 2012-07-09 20:55:26

0

HTTP::Response->base方法返回的值是从指定如何以解决出现在消息的内容相对URL的HTTP响应消息中获得的URL。如果消息没有指定这样的值,则使用用于请求消息的URL来代替。

如果你想要一个来自HTTP::Response的URL,假设在响应中没有相反的信息,那就直接使用URL即可。它可以很好地作为基本URL。

没有任何URL的单一基地。基本URL是用于解析相对URL的绝对URL,并且可以具有任意数量的路径步骤。

例如,

http://news.bbc.co.uk/1/hi/programmes/click_online/9735140.stm 

可以表示为

9735140.stm 

相对于基座URL

http://news.bbc.co.uk/1/hi/programmes/click_online/ 

或作为

1/hi/programmes/click_online/9735140.stm 
相对于基座URL

http://news.bbc.co.uk/ 

,或者

当然,路径可以被基部和相对URL在任何点之间划分。

你不会说什么是你想要使用的值。你干脆选择的解决方案剥掉那后面没有斜杠的URL路径组件的最后一个元素,因此对于URL

http://news.bbc.co.uk/1/hi/programmes/click_online 

返回

http://news.bbc.co.uk/1/hi/programmes/ 

http://news.bbc.co.uk/1/hi/programmes/click_online/ 

它返回相同的值

http://news.bbc.co.uk/1/hi/programmes/click_online/ 

如果这是您想要的行为,那么一切都很好,但我不会将其描述为“取得基本网址”。