首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby::HTTP-以下301重定向

Ruby::HTTP-以下301重定向
EN

Stack Overflow用户
提问于 2011-08-26 20:27:38
回答 5查看 26.1K关注 0票数 31

我的用户提交urls (在mixcloud.com上混合使用),我的应用程序使用它们来执行web请求。

good url返回200状态代码:

代码语言:javascript
复制
uri = URI.parse("http://www.mixcloud.com/ErolAlkan/hard-summer-mix/")
request = Net::HTTP.get_response(uri)(
#<Net::HTTPOK 200 OK readbody=true>

但是,如果您忘记了后面的斜杠,那么我们的好url将返回301:

代码语言:javascript
复制
uri = "http://www.mixcloud.com/ErolAlkan/hard-summer-mix"
#<Net::HTTPMovedPermanently 301 MOVED PERMANENTLY readbody=true> 

404的情况也是如此:

代码语言:javascript
复制
# bad path returns a 404
"http://www.mixcloud.com/bad/path/" 
# bad path minus trailing slash returns a 301
"http://www.mixcloud.com/bad/path"
  1. 我如何“向下钻”到301,看看它是否带我们到一个有效的资源或错误页面?
  2. 是否有一个工具可以全面概述特定域可能应用于其urls的规则?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-26 21:09:34

301重定向是相当常见的,如果您没有按web服务器的要求键入URL。它们发生的频率比你想象的要高得多,只是在浏览时你通常不会注意到它们,因为浏览器会自动为你做所有这些事情。

我想到了两个备选方案:

1:使用open-uri

open-uri自动处理重定向。所以你要做的就是:

代码语言:javascript
复制
require 'open-uri' 
...
response = open('http://xyz...').read

如果在HTTP和HTTPS之间重定向有困难,那么在这里查看一下解决方案:

红宝石打开-uri重定向禁止

2:使用Net::HTTP重定向

代码语言:javascript
复制
def get_response_with_redirect(uri)
   r = Net::HTTP.get_response(uri)
   if r.code == "301"
     r = Net::HTTP.get_response(URI.parse(r['location']))
   end
   r
end

如果您想变得更聪明,可以尝试在收到404响应时向URL添加或删除缺少的反斜杠。您可以通过创建一个像get_response_smart这样的方法来做到这一点,除了重定向之外,它还处理这个URL篡改。

票数 55
EN

Stack Overflow用户

发布于 2012-03-06 23:15:43

我不知道如何评论被接受的答案(这个问题可能已经结束了),但是我应该指出,r.header现在已经过时了,所以r.header['location']应该被r['location'] (per https://stackoverflow.com/a/6934503/1084675 )取代。

票数 8
EN

Stack Overflow用户

发布于 2016-07-01 15:27:34

rest-client遵循GETHEAD请求的重定向,不需要任何其他配置。效果很好。

  • 对于200到207之间的结果代码,将返回RestClient::Response
  • 对于结果代码301、302或307,如果请求是GET或HEAD,则将遵循重定向。
  • 对于结果代码303,将遵循重定向,并将请求转换为GET。

使用示例:

代码语言:javascript
复制
require 'rest-client'

RestClient.get 'http://example.com/resource'

rest-客户机自述还提供了一个使用POST请求重定向的示例:

代码语言:javascript
复制
begin
  RestClient.post('http://example.com/redirect', 'body')
rescue RestClient::MovedPermanently,
       RestClient::Found,
       RestClient::TemporaryRedirect => err
  err.response.follow_redirection
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7210232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档