本文实例讲述了Node.js设置HTTP头的方法。分享给大家供大家参考,具体如下:

server.js
//basic server的配置文件
var port = 3000;
var server = require('./basicserver').createServer();
server.useFavIcon("localhost", "./docroot/favicon.png");
server.addContainer(".*", "/l/(.*)$", require('./redirector'), {})
server.docroot("localhost", "/", "./docroot");
//server.useFavIcon("127.0.0.1", "./docroot/favicon.png");
//server.docroot("127.0.0.1", "/", "./docroot");
server.listen(port);
basicserver.js
Response Header 服务器发送到客户端
文件扩展名不足以完全恰当的标识文件类型,而且文件扩展名没有标准,于是,人们设计了Content-Type头和整个MIME类型标准来作为数据类型的表示系统。
对于某些应用,特别是一些处理固定数据的小型应用,我们可以精准的知道该使用哪一种Content-Type头,因为应用发送的数据是特定已知的。然而staticHandler能发送任何文件,通常不知道该使用哪种Content-Type。通过匹配文件扩展名列表和Content-Type可以解决这个问题,但是这个方案不完美。最好的实践方案是使用一个外部的配置文件,它通常由操作系统提供。
MIME npm包使用了Apache项目的mime.types文件,该文件包含超过600个Content-Type的有关数据,如果有需要,mime模块也支持添加自定义的MIME类型。
npm install mime
var mime = require('mime');
var mimeType = mime.lookup('image.gif'); //==> image/gif
res.setHeader('Content-Type', mimeType);
一些相关的HTTP头:
Content-Encoding 数据被编码时使用,例如gzip
Content-Language 内容中使用的语言
Content-Length 字节数
Content-Location 能取到数据的一个候补位置
Content-MD5 内容主题的MD5校验和
HTTP协议是无状态的,意味着web服务器不能辨认不同的请求发送端。现在普遍的做法是,服务器发送cookie到客户端浏览器,cookie中定义了登陆用户的身份,对于每一次请求,web浏览器都会发送对应所访问网站的cookie。
发送cookie时,我们应以如下方式为Set-Cookie或Set-Cookie2头设一个值:
res.setHeader('Set-Cookie2', ..cookie value..);
/*
Basic Server的核心模块会创建一个HTTP服务器对象,附加Basic Server上用于检查请求,然后给予适当响应的功能
Basic Server可以通过判断Host头部匹配的容器对象响应来自多个域名的请求
*/
var http = require('http');
var url = require('url');
exports.createServer = function(){
var htserver = http.createServer(function(req, res){
req.basicServer = {urlparsed: url.parse(req.url, true)};
processHeaders(req, res);
dispatchToContainer(htserver, req, res);
});
htserver.basicServer = {containers: []};
htserver.addContainer = function(host, path, module, options){
if (lookupContainer(htserver, host, path) != undefined){
throw new Error("Already mapped " + host + "/" + path);
}
htserver.basicServer.containers.push({host: host, path: path, module: module, options: options});
return this;
}
htserver.useFavIcon = function(host, path){
return this.addContainer(host, "/favicon.ico", require('./faviconHandler'), {iconPath: path});
}
htserver.docroot = function(host, path, rootPath){
return this.addContainer(host, path, require('./staticHandler'), {docroot: rootPath});
}
return htserver;
}
var lookupContainer = function(htserver, host, path){
for (var i = 0; i < htserver.basicServer.containers.length; i++){
var container = htserver.basicServer.containers[i];
var hostMatches = host.toLowerCase().match(container.host);
var pathMatches = path.match(container.path);
if (hostMatches !== null && pathMatches !== null){
return {container: container, host: hostMatches, path: pathMatches};
}
}
return undefined;
}
//用于搜索req.headers数组以查找cookie和host头部,因为这两个字段对请求的分派都很重要
//这个函数在每一个HTTP请求到达时都会被调用
//还有很多其他的HTTP头部字段(Accept Accept-Encoding Accept-Language User-Agent)
var processHeaders = function(req, res){
req.basicServer.cookies = [];
var keys = Object.keys(req.headers);
for (var i = 0; i < keys.length; i++){
var hname = keys[i];
var hval = req.headers[hname];
if (hname.toLowerCase() === "host"){
req.basicServer.host = hval;
}
//提取浏览器发送的cookie
if (hname.toLowerCase() === "cookie"){
req.basicServer.cookies.push(hval);
}
}
}
//查找匹配的容器,分派请求到对应的容器中
//这个函数在每一个HTTP请求到达时都会被调用
var dispatchToContainer = function(htserver, req, res){
var container = lookupContainer(htserver, req.basicServer.host, req.basicServer.urlparsed.pathname);
if (container !== undefined){
req.basicServer.hostMatches = container.host;
req.basicServer.pathMatches = container.path;
req.basicServer.container = container.container;
container.container.module.handle(req, res);
}else {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end("no handler found for " + req.basicServer.host + "/" + req.basicServer.urlparsed);
}
}
staticHandler.js
//用于处理文件系统内的文件,docroot选项指被存放文件所在文件夹的路径,读取该目录下的指定文件
var fs = require('fs');
var mime = require('mime');
var sys = require('sys');
exports.handle = function(req, res){
if (req.method !== "GET"){
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end("invalid method " + req.method);
} else {
var fname = req.basicServer.container.options.docroot + req.basicServer.urlparsed.pathname;
if (fname.match(/\/$/)) fname += "index.html"; //如果URL以/结尾
fs.stat(fname, function(err, stats){
if (err){
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end("file " + fname + " not found " + err);
} else {
fs.readFile(fname, function(err, buf){
if (err){
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end("file " + fname + " not readable " + err);
} else {
res.writeHead(200, {'Content-Type': mime.lookup(fname),
'Content-Length': buf.length});
res.end(buf);
}
});
}
});
}
}
faviconHandler.js
//这个处理函数处理对favicon.ico的请求
//MIME模块根据给出的图标文件确定正确的MIME类型,网站图标favicon可以是任何类型的图片,但是我们必须要告诉浏览器是哪个类型
//MIME模块,用于生成正确的Content-Type头
var fs = require('fs');
var mime = require('mime');
exports.handle = function(req, res){
if (req.method !== "GET"){
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end("invalid method " + req.method);
} else if (req.basicServer.container.options.iconPath !== undefined){
fs.readFile(req.basicServer.container.options.iconPath, function(err, buf){
if (err){
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(req.basicServer.container.options.iconPath + "not found");
} else {
res.writeHead(200, {'Content-Type': mime.lookup(req.basicServer.container.options.iconPath),
'Content-Length': buf.length});
res.end(buf);
}
});
} else {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end("no favicon");
}
}
redirector.js
/*
把一个域的请求重定向到另一个上,例如将www.example.com重定向到example.com上,或者使用简短的URL跳转到较长的URL
实现这两种情况,我们需要在HTTP响应中发送301(永久移除)或者302(临时移除)状态码,并且指定location头信息。有了这个组合
信号,web浏览器就知道要跳转到另一个web位置了
*/
//地址http://localhost:3000/l/ex1 会跳转到http://example1.com
var util = require('util');
var code2url = {'ex1': 'http://example1.com', 'ex2': "http://example2.com"};
var notFound = function(req, res){
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end("no matching redirect code found for " + req.basicServer.host + "/" + req.basicServer.urlparsed.pathname);
}
exports.handle = function(req, res){
if (req.basicServer.pathMatches[1]){
var code = req.basicServer.pathMatches[1];
if (code2url[code]){
var url = code2url[code];
res.writeHead(302, {'Location': url});
res.end();
} else {
notFound(req, res);
}
} else {
notFound(req, res);
}
}
docroot目录下:有favicon.png
index.html
<html> <head> </head> <body> <h1>Index</h1> <p>this is a index html.</p> </body> </html>
希望本文所述对大家nodejs程序设计有所帮助。
# Node.js
# 设置
# HTTP头
# 从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
# 从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
# 从零开始学习Node.js系列教程五:服务器监听方法示例
# 从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
# 从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
# 从零开始学习Node.js系列教程四:多页面实现的数学运算示例
# 从零开始学习Node.js
# 跳转到
# 文件扩展名
# 知道该
# 配置文件
# 移除
# 客户端
# 重定向
# 目录下
# 最好的
# 多个
# 其他的
# 我们可以
# 这两个
# 可以通过
# 给大家
# 都很
# 自定义
# 在每一个
# 发送到
# 哪种
相关文章:
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
如何在阿里云购买域名并搭建网站?
淘宝制作网站有哪些,淘宝网官网主页?
大连网站设计制作招聘信息,大连投诉网站有哪些?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
宝塔面板创建网站无法访问?如何快速排查修复?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在云主机快速搭建网站站点?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
金*站制作公司有哪些,金华教育集团官网?
Python lxml的etree和ElementTree有什么区别
建站之星安装需要哪些步骤及注意事项?
如何选择高性价比服务器搭建个人网站?
韩国服务器如何优化跨境访问实现高效连接?
C++如何使用std::optional?(处理可选值)
,网站推广常用方法?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
网站制作难吗安全吗,做一个网站需要多久时间?
如何快速搭建个人网站并优化SEO?
建站主机系统SEO优化与智能配置核心关键词操作指南
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
如何选择靠谱的建站公司加盟品牌?
建站之星北京办公室:智能建站系统与小程序生成方案解析
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何通过多用户协作模板快速搭建高效企业网站?
小型网站建站如何选择虚拟主机?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何获取免费开源的自助建站系统源码?
如何做静态网页,sublimetext3.0制作静态网页?
广东企业建站网站优化与SEO营销核心策略指南
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何打造高效商业网站?建站目的决定转化率
如何在IIS管理器中快速创建并配置网站?
如何在Golang中使用replace替换模块_指定本地或远程路径
如何快速生成橙子建站落地页链接?
建站主机与服务器功能差异如何区分?
家庭建站与云服务器建站,如何选择更优?
如何快速搭建响应式可视化网站?
建站之星导航如何优化提升用户体验?
股票网站制作软件,网上股票怎么开户?
Android自定义listview布局实现上拉加载下拉刷新功能
*请认真填写需求信息,我们会在24小时内与您取得联系。