从文件中添加 HTTP Content-Type 标头无法正常工作

从文件中添加 HTTP Content-Type 标头无法正常工作

我有一个运行在 Apache 2.4 上的服务器。客户端可以上传文件,这些文件仅以压缩形式存储。每个文件还创建一个包含该文件 mimetype 的文本文件。

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

我到目前为止所拥有的:我编写了一个 python 脚本,它获取正确的 mimetype 并将其写入 stdout,并将这些指令添加到相关的 apache 配置文件中

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
但是当上传新文件时,后续下载的 Content-Type 标头为空(即使对于之前有效的文件也是如此)。

更新:根据 Anson W Han 的回答,解决方案应该是使用 .htaccess 文件,因为配置文件在服务启动/重新加载时只被解析一次。

不幸的RewriteMap是,.htaccess 中不允许。我尝试添加

RewriteEngine On     
RewriteMap mimetype prg:/home/user/scripts/mimetype.py

指令到站点配置文件,并放置包含以下内容的 .htaccess 文件

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

在站点的文档根目录中。但是这根本不起作用。Content-Type Header 现在始终为空。

允许 htaccess 覆盖,并且http://www.htaccesscheck.com/说语法没有问题,就像这样apachectl configtest

有没有办法使用 .htaccess 文件使其工作?

答案1

听起来您已将 Rewrite 指令放入站点的 httpd.conf apache 文件中。此文件仅在服务启动/重新加载时解析一次。

如果您将 Rewrite 指令放在网站的 .htaccess 中,每次调用某些内容时它都会被触发,从而反映出脚本中最新的 mime 类型。为此,请确保:

  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. 通过 Apache 配置检查器运行更新的 httpd.conf 或等效文件(例如检查 Apache 服务器配置文件有效性的命令

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

答案2

我终于找到了解决方案:问题不在于配置文件本身,而是缺少RewriteCond

如果没有它,重写块也会在文件上传时被错误执行,从而导致stdinPython 脚本出现奇怪的错误输入。

因此,将其添加RewriteCond到服务器配置文件并处理 python 脚本中的错误输入可以充分解决此问题,即使不使用 .htaccess 文件。

相关内容