如何在HTTP headers设置有效日期?这个指的是在服务器上或者网页中加入的吗?怎么设置?求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在HTTP headers设置有效日期?这个指的是在服务器上或者网页中加入的吗?怎么设置?求解相关的知识,希望对你有一定的参考价值。

使用浏览器缓存 在HTTP headers设置有效日期可使浏览器优先从本地硬盘而不是从网络下载资源。

参考技术A 如果一个页面已经在你的浏览器中被缓存,那么你下次浏览时浏览器将会检测文档是否被修改过,那么它就会发送这样的头部:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
如果自从这个时间以来未被修改过,那么服务器将会返回“304 Not Modified”,而且不会再返回内容。浏览器将自动去缓存中读取内容
php中,可以用$_SERVER['HTTP_IF_MODIFIED_SINCE'] 来检测。
// assume $last_modify_time was the last the output was updated
// did the browser send If-Modified-Since header?
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
// if the browser cache matches the modify time
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
// send a 304 header, and no content
header("HTTP/1.1 304 Not Modified");
exit;


-------------------------------------
或者可以这样来定义
-------------------------------------
在PHP中,你可以通过 header() 来设置头部响应信息。PHP已经自动发送了一些必要的头部信息,如 载入的内容,设置 cookies 等等… 你可以通过 headers_list() 函数看到已发送和将要发送的头部信息。你也可以使用headers_sent()函数来检查头部信息是否已经被发送。
Cache-Control

w3.org 的定义是:“The Cache-Control general-header field is used to specify directives which MUST be obeyed by all caching mechanisms along the request/response chain.” 其中“caching mechanisms” 包含一些你ISP可能会用到的 网关和代理信息。
例如:
以下是代码片段:Cache-Control: max-age=3600, public

“public”意味着这个响应可以被任何人缓存,“max-age” 则表明了该缓存有效的秒数。允许你的网站被缓存降大大减少下载时间和带宽,同时也提高的浏览器的载入速度。追问

代码加到哪里呢

追答



code

ERR_HTTP_HEADERS_SENT - Express:标头在发送到客户端后无法设置,我该如何解决这个错误?

【中文标题】ERR_HTTP_HEADERS_SENT - Express:标头在发送到客户端后无法设置,我该如何解决这个错误?【英文标题】:ERR_HTTP_HEADERS_SENT - Express: headers cannot be set after they are sent to the client, how can i solve this error? 【发布时间】:2020-05-15 05:39:45 【问题描述】:

我已经在 *** 上尝试了很多不同的解决方案,但是。但他们没有工作。

它引发了这个错误:

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:485:11) 在 ServerResponse.location (/mnt/c/Users/Lucas-PC/) 的 ServerResponse.header (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/response.js:771:10) Desktop/OnlineChat/node_modules/express/lib/response.js:888:15) 在 ServerResponse.redirect (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/response.js:926: 18) 在声明中。 (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/app.js:135:28) --> 在 Database#each("SELECT * FROM users WHERE email='yyyy@yyyy'", [Function]) 在 /mnt/c/Users/Lucas-PC/Desktop/OnlineChat/app.js:133:16 在 Layer.handle [as handle_request] (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/layer.js:95:5) 在下一个(/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/route.js:112:3) 在 Layer.handle [as handle_request] (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/layer.js:95:5) 在 /mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/index.js:281:22 在 Function.process_params (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/index.js:335:12) 在下一个(/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/index.js:275:10) 在 /mnt/c/Users/Lucas-PC/Desktop/OnlineChat/app.js:70:5 代码:'ERR_HTTP_HEADERS_SENT', __augmented:是的

这是我的代码:


const redirectLogin = (req, res, next) => 
    if (!req.session.userId)
        res.redirect('/login');
    else 
        next();
    


const redirectHome = (req, res, next) => 
    if (req.session.userId)
        res.redirect('/dashboard');
    else 
        next();
    


app.post('/login', redirectHome, (req, res) => 
    reloadUsers(users);
    const  email, password  = req.body;
    if (email && password) 
        const user = users.find(user => user.email === email && user.password === password) // TODO: hash password
        if (user)
            console.log(user.id);
            req.session.userId = user.id;
            res.redirect('/dashboard');
            return;
        
    
    res.redirect('/')
)


app.post('/register', redirectHome, (req, res) => 
    const  name, job, email, password  = req.body;

    if (name && job && email && password) // TODO: validation more complex
        const exists = users.some(user => user.name === name && user.email === email);

        if(!exists)
            let infos = [name, email, job, password];
            let placeholders = infos.map((info) => '?').join(',');
            let sql = 'INSERT INTO users(name, email, job, password) VALUES('+ placeholders +')';
            db.run(sql, infos);
            console.log('email: '+req.body.email);
            db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => 
                req.session.userId = row.id;
            )
            return res.redirect('/dashboard');
        
    

    res.redirect('/');
)

app.post('/logout', redirectLogin, (req, res) => 
    reloadUsers(users);
    req.session.destroy(err => 
        if (err)
            return res.redirect('/dashboard');
        
        res.clearCookie(SESS_NAME);
        res.redirect('/login');
    );
)

我认为错误来自res.redirect('/dashboard') 上的app.post('/login')app.post('/register')

【问题讨论】:

【参考方案1】:

在您的/register 路由器下,您尝试在发送响应后设置请求。

db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => 
    req.session.userId = row.id;
)
return res.redirect('/dashboard');

db.each() 是一个异步函数,因此您必须在函数内处理响应。

db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => 
    req.session.userId = row.id;
    return res.redirect('/dashboard');
)

一些提示:在构造 SQL 语句时,还要尝试转义字符串以避免 SQL 注入。

【讨论】:

以上是关于如何在HTTP headers设置有效日期?这个指的是在服务器上或者网页中加入的吗?怎么设置?求解的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cloudfront 时,如何设置相对于当前日期的 Expires Header?

如何通过chrome看到网站的header

如何在 .Net / C# 中将日期转换为 HTTP 格式的日期

Oracle GL账户和日期是指啥

java中如何设置HTTP协议的头信息(header)

access有效性规则 日期的比较 问题