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

https://calfgz.github.io/blog/2018/05/http-redirect-java-node.html

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?&s, function(link){
console.log(link);
});

# Java# http# NodeJs


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状态描述。