用Java和Nodejs获取http30X跳转后的url

301永久重定向

定义

301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。

301比较常用的场景是使用域名跳转。

比如,我们访问 http://www.baidu.com 会跳转到 https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

注意: 301请求是可以缓存的, 即通过看status code,可以发现后面写着from cache。

或者你把你的网页的名称从php修改为了html,这个过程中,也会发生永久重定向。

Nginx配置

rewrite后面接上permenent就代表301跳

1
2
3
4
//把来自veryyoung.me的请求301跳到 www.veryyoung.me
if ($host != 'veryyoung.me') {
rewrite ^/(.*)$ http://www.veryyoung.me/$1 permanent;
}

302临时重定向

定义

302 Found 请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

比如未登陆的用户访问用户中心重定向到登录页面。

访问404页面会重新定向到首页。

Nginx配置

rewrite后面接上redirect就代表302跳

1
2
3
4
//把来自veryyoung.me的请求302跳到 www.veryyoung.me
if ($host != 'veryyoung.me') {
rewrite ^/(.*)$ http://www.veryyoung.me/$1 redirect;
}

301与302的区别

302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。

而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。

Java实现获取301或302跳转后的URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public String findLink(String url) {
String result = null;
try {
URL serverUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();
conn.setRequestMethod("GET");
// 必须设置false,否则会自动redirect到Location的地址
conn.setInstanceFollowRedirects(false); conn.addRequestProperty("Accept-Charset", "UTF-8;");
conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8");
conn.connect();
String location = conn.getHeaderField("Location");
int code = conn.getResponseCode();
if (code == 301 || code == 302) {
location = findLink(location);
} else {
location = conn.getURL().toString();
}
result = location;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

用NodeJs实现获取301或302跳转后的URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var request = require('request');

var find_link = function (link, collback) {

    var f = function (link) {
var options = {
url: link,
followRedirect: false,
headers : {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept-Charset': 'UTF-8;',
'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8',
}
} request(options, function (error, response, body) {
console.log(response.statusCode);
if (response.statusCode == 301 || response.statusCode == 302) {
var location = response.headers.location;
console.log('location: ' + location);
f(location);
} else {
//console.log(body);
collback(link);
}
})
} f(link);
} find_link("http://a.m.taobao.com/i538372076663.htm?&sid=7ac494a5aa270ce9562feadef7423650", function(link){
console.log(link);
});
 
 
 
 

Node.js实现301、302重定向服务

转 https://itbilu.com/nodejs/core/4yMyt38M.html

在Web应用中,有时会遇到页面需要Url重定向的情况。Url重定向分为301302两种。301302都是HTTP状态的编码,都代表着某个Url发生了转移。不同的是301重定向是永久的重定向(Moved Permanently),表示本网页永久性转移到另一个地址,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。302重定向是临时的重定向(Moved Temporarily),表示本网页暂时性转移到另一个地址,搜索引擎会抓取新的内容而保留旧的网址。

可以用Nodejs的http模块,实现一个301302重定服务,实现代码如下:

实现301重定向服务:

var http = require('http');

var server = http.createServer(function (req, res) {
res.writeHead(301, {'Location': 'http://itbilu.com/'});
console.log(res._header);
res.end();
}); server.listen(3100)

Log打印结果为:

HTTP/1.1 301 Moved Permanently
Location: http://itbilu.com/
Date: Mon, 27 Apr 2015 05:39:47 GMT
Connection: keep-alive
Transfer-Encoding: chunked

实现302重定向服务:

var http = require('http');

var server = http.createServer(function (req, res) {
res.writeHead(302, {'Location': 'http://itbilu.com/'});
console.log(res._header);
res.end();
}); server.listen(3100)

Log打印结果为:

HTTP/1.1 302 Moved Temporarily
Location: http://itbilu.com/
Date: Mon, 27 Apr 2015 05:40:51 GMT
Connection: keep-alive
Transfer-Encoding: chunked

由上可见,浏览器会跟根据301302状态码,跳转到Location对应的网址中。Node.js在设置301302状态时,还自动加入了Moved PermanentlyMoved Temporarily状态描述。

用Java和Nodejs获取http30X跳转后的url的更多相关文章

  1. 获取经过跳转后的url地址

    粗略一算,不写code已经好几个月了. 昨日受兄弟所托,为他写了一个小小的程序. 程序功能: 自动获取跳转后的Url地址 如下图所示: (newUrl.txt为转换后的地址信息...) 实现过程: 每 ...

  2. PHP 取302跳转后真实 URL 的两种方法

    1 . 第一种,CURL形式[感觉处理略慢,代码偏多] $url = '将跳转的URL'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url) ...

  3. PHP获取跳转后的URL,存到数据库,设置缓存时间

    <?php error_reporting(0); header("Content-Type: text/html; charset=utf-8"); $fid=$_GET[ ...

  4. PHP使用CURL获取302跳转后的地址实例

    /*返回一个302地址*/     function  curl_post_302($url, $vars) { $ch = curl_init();          curl_setopt($ch ...

  5. C#抓取页面时候,获取页面跳转后的地址

    static string fanhuiurl(string cahxunurl) { string url = ""; HttpWebRequest req = (HttpWeb ...

  6. 关于使用struts2跳转后css和js失效的解决方式

    根据观察,主要是由于通过action跳转后的url会根据命名空间,自动跳转到命名空间子目录,使得当前引用的css和js查找不到,从而失效,根据这个原因,可使用四种办法解决: 1.使用struts2.x ...

  7. gRPC中Any类型的使用(Java和NodeJs端)

    工作中要把原来Java服务端基于SpringMVC的服务改为使用gRPC直接调用.由于原Service的返回值为动态的Map类型,key值不确定,且value的类型不唯一,因此使用了protobuf ...

  8. Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL

    Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL >>>>>>>>>>>>> ...

  9. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

随机推荐

  1. CentOS 6 使用 tptables 打开关闭防火墙与端口

    开启访问端口 Linux版本:CentOS release 6.9 此处以nginx访问端口8081为例 编辑:vi /etc/sysconfig/iptables 添加:-A RH-Firewall ...

  2. 在地址栏里输入一个 URL后,按下 Enter 到这个页面呈现出来,中间会发生什么?

    这是一个面试高频的问题 在输入 URL 后,首先需要找到这个 URL 域名的服务器 IP,为了寻找这个 IP,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存 ->系统缓 ...

  3. django的缓存实例应用

    那么多的可配置方法,我们用那个呢. 首先在setting中配置你想要的缓存,我这里就用文件的方式是配置.如图: 第二步: 第三步: 第四步:  实现结果: 总结: 都是指明当前资源的有效期,控制浏览器 ...

  4. 【笔记】MAML-模型无关元学习算法

    目录 论文信息: Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networ ...

  5. 调试中行支付demo

    用eclipse调试中行支付demo,本来报错. 让我同学帮我远程看了下,他删了服务器,又添加服务器,然后竟然可以运行了,牛逼! 原来报错: at java.net.URLClassLoader$1. ...

  6. 读react源码准备

    git源码地址:https://github.com/facebook/react react 里面就是 react源码 react里面的react文件夹就是react源码,react源码非常的少,总 ...

  7. jquery 子元素 后代元素 兄弟元素 相邻元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  8. dt系统中tag如何使用like与%来进行模糊查询

    在destoon中,如果一个品牌的详细显示页,如果要显示与品牌相关的供应的话,可以通过查询标题中带有品牌关键字的这一条件来进行查询,但是经过测试发现不能正确解析, 然后查看文件的源文件,发现 {tag ...

  9. 通过vue-cli搭建vue项目

    一.搭建环境 安装node.js 从node.js官网下载并安装node,安装过程很简单,一路“下一步”就可以了.安装完成之后,打开命令行工具(win+r,然后输入cmd),输入 node -v,如下 ...

  10. MySQL中去重字段完全相同的数据

    思路:创建一个临时表,在原有的表结构基础上增加一列编号,再进行去除重复的记录 本例子是在对表 main_body_sz 进行去重 创建一个临时表 create table main_body_sz_a ...