我有一个运行在 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 类型。为此,请确保:
- 确保 apache httpd.conf 或等效文件允许 htaccess 覆盖。
- 确认是否要在请求的早期或晚期修改标头。请参阅http://httpd.apache.org/docs/current/mod/mod_headers.html
- 将 Rewrite 块添加到 Web 服务器根目录中的 .htaccess 文件中。
- 通过检查器运行你的 htaccess 文件以确保它有效。(你可以使用类似http://www.htaccesscheck.com/)
- 通过 Apache 配置检查器运行更新的 httpd.conf 或等效文件(例如检查 Apache 服务器配置文件有效性的命令)
应用更新后,不要忘记重新启动 Apache(希望这是最后一次)!
答案2
我终于找到了解决方案:问题不在于配置文件本身,而是缺少RewriteCond
。
如果没有它,重写块也会在文件上传时被错误执行,从而导致stdin
Python 脚本出现奇怪的错误输入。
因此,将其添加RewriteCond
到服务器配置文件并处理 python 脚本中的错误输入可以充分解决此问题,即使不使用 .htaccess 文件。