无法使用 Apache 在图像上设置过期标头

Posted

技术标签:

【中文标题】无法使用 Apache 在图像上设置过期标头【英文标题】:Can't set expire header on images with Apache 【发布时间】:2017-03-19 15:59:21 【问题描述】:

我试图通过在我的 Django 应用程序的根目录中设置一个 .htaccess 文件来告诉浏览器缓存我的应用程序中的任何类型的图像文件 (png/jpg/gif/etc)。

.htaccess

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType image/gif "access plus 365 days"
  ExpiresByType image/jpeg "access plus 365 days"
  ExpiresByType image/png "access plus 365 days"
</IfModule>

阿帕奇

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so
LoadModule unixd_module      modules/mod_unixd.so
LoadModule expires_module    modules/mod_expires.so
LoadModule headers_module    modules/mod_headers.so

<Directory />s
    AllowOverride All
</Directory>

LogFormat "%X-Forwarded-Fori %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
CustomLog /home/timbaney1989/logs/user/access_baneydev.log combined
ErrorLog /home/timbaney1989/logs/user/error_baneydev.log

在添加 AllowOverride All 选项之前,我遇到了内部服务器错误,但现在我的应用程序运行良好。但是,当我检查网络并看到正在加载的图像时,我在该图像的任何地方都看不到过期标头。服务器还说它是 nginx ?在 Apache 服务器上运行您的应用程序并让 Nginx 服务器加载您的静态文件是正常的吗?我的 Django 应用程序或 Apache httpd.conf 文件中是否有遗漏或输入错误?

【问题讨论】:

【参考方案1】:

看起来 twitter.png 文件得到了 404:

HTTP/1.1 404 Not Found
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Sun, 06 Nov 2016 06:44:39 GMT
Server: nginx
Vary: Accept-Encoding

这是 Nicholas Kuechler 对 solution 的修改版

location ~* \.(png|jpe?g|gif|ico|tiff)$ 
  expires max;
  log_not_found off;
  access_log off;

如果它得到 404,您可能有 root 指令错误地设置为位置块继承。确认根(DocumentRoot)是正确的,并且文件相对于根路径存在,并且应该显示出来。

【讨论】:

【参考方案2】:

您也可以按照 uWSGI 和 NGINX 的本指南替换 apache,并将静态文件设置为位置块中的别名,并添加我之前回答的标题。

http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

【讨论】:

以上是关于无法使用 Apache 在图像上设置过期标头的主要内容,如果未能解决你的问题,请参考以下文章

无效的 cookie 标头:过期属性为空时无法解析过期属性

无法使用XPATH设置标头

JavaScript无法刷新 - 必须清除缓存

无法在 HttpFormUrlEncodedContent 上设置标头

通过 .htaccess 设置过期标头和压缩数据

仅在 Cloud9 上出现错误“发送后无法设置标头”