Apache2 mod_perl Last-Modified 标头被忽略
我有一个 perl 生成的页面。 此页面的内容每 30 分钟更改一次,因此我将 $r->set_last_modified() 设置为内容上次更改的时间。
一切正常,我可以看到正确的标头到达我的浏览器。
当我刷新页面时,我看到浏览器在向服务器发出的请求中使用了正确的“If-Modified-Since”标头,但 Apache2 忽略了这一点并重新发送整个页面。
如何让 Apache2 正确运行并响应“HTTP/1.x 304 Not Modified”?
(当从同一个 Apache2 进程请求静态内容时,“last-modified”/“if-modified-since”标头会被正确处理。)
感谢您的帮助。
编辑:我的期望是错误的吗? 我是否必须在 Perl 脚本中显式处理入站 If-Modified-Since 标头?
I have a perl generated page. The contents of this page change every 30 minutes, so I'm setting $r->set_last_modified() to the time the contents last changed.
That all works well and I can see the correct header arriving at my browser.
When I refresh the page, I see my browser uses the correct "If-Modified-Since" header in the request to the server, but Apache2 ignores this and re-sends the entire page.
How can I get Apache2 to behave correctly and respond with a "HTTP/1.x 304 Not Modified" ?
(The "last-modified" / "if-modified-since" headers are handled correctly when requesting static content from the same Apache2 process.)
Thanks for any help.
EDIT: Are my expectations wrong? Do I have to explicitly handle inbound If-Modified-Since headers in my perl script?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可悲的是,是的,您的期望是错误的。
当您基本上对 Apache 说“好吧,我正在处理这个请求......”时,Apache 会将所有事情的责任移交给您。 如果您希望请求遵守 If-Modified-Since,则取决于您的代码。
面对现实,这是正确的行为,因为 Apache 无法知道 Perl 处理程序中“修改”的真正含义:最好的检查可能是在后端数据库中查询时间戳记录,例如......
Sadly, yes, your expectations are wrong.
At the point where you basically say to Apache "OK, I'm dealing with this request...", Apache is going to hand over responsibility for everything to you. If you want the request to honour If-Modified-Since, it's down to your code.
Face it, this is the right behaviour, since there's no way Apache can know what you /really/ mean by 'modified' in a Perl handler: it might be that the best check is to go query your backend DB for a timestamp on a record, for example....
Apache 在处理请求时不会存储您最后修改的值。 因此,为了确定某些内容是否被修改,必须运行您的应用程序。
Apache won't store your last-modified value when it processes a request. So in order to decide whether something was modified it will have to run your application.