Назад | Перейти на главную страницу

Добавление заголовка 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 для следующих загрузок пуст (даже для файлов, которые работали раньше).

Обновить: После ответа Ансона Ван Хана решение должно использовать файл .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

в сайтах Document Root. Но это вообще не работает. Заголовок Content-Type теперь все время пуст.

htaccess разрешены и http://www.htaccesscheck.com/ говорит, что синтаксис в порядке, как и apachectl configtest.

Есть ли способ заставить его работать с помощью файла .htaccess?

Наконец-то я нашел решение: проблема заключалась не в самом файле конфигурации, а в отсутствующем RewriteCond.

Без него блок перезаписи также неправильно выполнялся для загрузки файлов, что приводило к странной ошибке stdin входы для скрипта Python.

Итак, добавив RewriteCond в файл конфигурации сервера и обработка неправильного ввода в скрипте python адекватно решила эту проблему для меня, даже без использования файла .htaccess.

Похоже, вы разместили свою директиву Rewrite в файле apache httpd.conf вашего сайта. Этот файл анализируется только один раз при загрузке / перезагрузке службы.

Если вы поместите директиву Rewrite в .htaccess сайта, она будет попадать каждый раз, когда что-то будет вызвано, и, таким образом, будет отражать последний тип mime из вашего скрипта. Для этого обязательно:

  1. Убедитесь, что apache httpd.conf или аналогичный файл допускает переопределения htaccess.
  2. Подтвердите, хотите ли вы изменить заголовки в начале или в конце запроса. Видеть http://httpd.apache.org/docs/current/mod/mod_headers.html
  3. Добавьте блок Rewrite в файл .htaccess в корневом каталоге вашего веб-сервера.
  4. Запустите файл htaccess через программу проверки, чтобы убедиться, что он действителен. (вы можете использовать такой инструмент, как http://www.htaccesscheck.com/)
  5. Запустите обновленный httpd.conf или аналогичный файл через средство проверки конфигурации apache (например, команду, указанную в Команда для проверки правильности конфигурационных файлов сервера Apache)

После применения обновлений не забудьте перезапустить Apache (надеюсь, в последний раз)!