从文件中添加HTTP内容types标题无法正常工作

这是我在这里的第一篇文章,我会尽我所能做到尽可能清晰和短小。

所以我有一个运行在Apache 2.4上的服务器。 客户端可以上传文件,这些文件只能压缩成.gz格式。 为每个文件也创build一个包含该文件的mimetype的文本文件。

当客户端下载文件时,我希望服务器从这个文本文件中读取mimetype,并分别设置HTTP Content-Type Header。

我到现在为止:我做了一个Python脚本,它获得正确的MIMEtypes,并写入标准输出:

#!/usr/bin/python import sys, os while True: sha256hash = sys.stdin.readline().strip().lstrip('/') directory = '/var/www/path/to/mimetypes' mimetype = open(directory + sha256hash,'rb').read() sys.stdout.write(mimetype + '\n') sys.stdout.flush() 

并将这些指令添加到相关的Apacheconfiguration文件

 RewriteEngine On RewriteMap mimetype prg:/home/user/scripts/mimetype.py RewriteRule ^(.*)$ - [ENV=CONTENTTYPE:${mimetype:%{REQUEST_FILENAME}}] Header append Content-Type "%{CONTENTTYPE}e" env=CONTENTTYPE 

所以脚本被调用。

问题 :它只适用于service apache2 reload
但是,当上传新文件(甚至上传失败并且没有添加新文件时),系统就会崩溃。 这意味着下列内容的内容types标题是空的(即使是之前的文件也是如此)。

示例响应标题:

 HTTP/1.1 200 OK Date: Thu, 23 Nov 2017 09:09:25 GMT Server: Apache/2.4.18 (Ubuntu) Accept-Ranges: bytes Content-Length: 449891 Vary: Accept-Encoding Content-Type: Content-Encoding: gzip 

service apache2 reload修复了一次。

那么有没有办法让它工作,而不需要每次上传后重新加载?

这听起来像你把你的Rewrite指令放在你的站点的httpd.conf apache文件中。 这个文件在服务启动/重新加载时只被parsing一次。

如果您将Rewrite指令放在站点的.htaccess中,则每次调用某个对象时都会触发,从而反映脚本中最新的MIMEtypes。 要做到这一点,一定要:

  1. 确保Apache httpd.conf或等效文件允许htaccess覆盖。
  2. 确认是否要在请求中提前或延迟修改标头。 请参阅http://httpd.apache.org/docs/current/mod/mod_headers.html
  3. 将Rewrite块添加到Web服务器根目录中的.htaccess文件中。
  4. 通过检查器运行你的htaccess文件,以确保它是有效的。 (你可以使用像http://www.htaccesscheck.com/这样的工具)
  5. 通过apacheconfiguration检查器运行更新的httpd.conf或等价文件(例如命令中logging的检查Apache服务器configuration文件有效性的命令 )

应用更新后,不要忘记重新启动Apache(希望最后一次)!