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

Модуль заголовков Apache загружен, но не может устанавливать заголовки в htaccess

У меня установлен Apache 2.2.29 (unix) и он работает на моей новой машине разработчика (Mac). Я пытаюсь установить заголовки CORS для проекта API - что я делал много раз.

Файл htaccess для проекта выглядит так:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE" 
    Header set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type"
    ServerSignature Off
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /cms/public
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]
</IfModule>

и модуль заголовков загружен в мой конф:

LoadModule headers_module libexec/mod_headers.so

Файл модуля существует в месте, указанном в apache conf, и правильно ли он загружен:

dan$ httpd -M

Loaded Modules:
 core_module (static)
 mpm_event_module (static)
 http_module (static)
 so_module (static)
 authn_file_module (shared)
 authn_dbm_module (shared)
 authn_anon_module (shared)
 ...
 headers_module (shared)

Я также проверил настройки переопределения conf в моем основном conf и включенном vhosts conf:

<Directory "/Users/dan/Sites">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Allow from all
    </IfModule>
</Directory>

Однако заголовки не устанавливаются должным образом. Вот заголовки ответа при запросе к проекту API с использованием указанного выше файла htaccess:

HTTP/1.1 200 OK
Date: Wed, 22 Jul 2015 10:36:05 GMT
Server: Apache/2.2.29 (Unix) DAV/2 mod_fastcgi/2.4.6 mod_ssl/2.2.29 OpenSSL/1.0.2c
Expires: Wed, 15 Jul 2015 10:36:05 GMT
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8

Я протестировал настройку приложения в других средах apache, и он работает, как ожидалось ... так что это определенно связано с моей настройкой. Это сводит меня с ума!

Есть предположения? Дэн

Для всех, у кого еще есть эта проблема: мне помогли поменять allowOverride None к allowOverride All в файле httpd.conf

Если вы все еще заинтересованы в решении проблемы, у меня есть несколько предложений. Основная идея конфигурации прекрасна, я протестировал ее на простой настройке, и заголовки были установлены правильно.

Это означает, что проблема, вероятно, связана с файлом htaccess и возможностью серверов использовать его. Сначала я бы попробовал поместить "мусор" в файл htaccess (все, что не является допустимой конфигурацией Apache). Если файл htaccess читается правильно, все запросы, которые вызывают чтение файла, будут генерировать 500 Internal Server Error.

Следующий запуск apachectl -S и проверьте результат, укажите его в своем вопросе, если вы не уверены. Вы должны убедиться, что запрос соответствует <Directory> заблокировать в своем вопросе. Боюсь, что вы мало что можете сделать, кроме поиска в файлах конфигурации. При этом убедитесь, что AllowOverride где-то не переопределен.

Также вы используете mod_fastcgi, поэтому в зависимости от вашей конфигурации запрос может вообще не соответствовать каталогу в файловой системе, что требуется для чтения файла htaccess.