已加载 Apache 标头模块但无法在 htaccess 中设置标头

Dan*_*ake 8 .htaccess httpd.conf http-headers apache-2.2 cors

我在我的新开发机器 (mac) 上安装并运行了 Apache 2.2.29 (unix)。我正在尝试为 API 项目设置 CORS 标头 - 我已经做过很多次了。

该项目的 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>
Run Code Online (Sandbox Code Playgroud)

并且 headers 模块已加载到我的 conf 中:

LoadModule headers_module libexec/mod_headers.so
Run Code Online (Sandbox Code Playgroud)

模块文件存在于 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)
Run Code Online (Sandbox Code Playgroud)

我还检查了主 conf 和包含的 vhosts conf 中的 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>
Run Code Online (Sandbox Code Playgroud)

但是,标头未按预期设置。以下是使用上述 htaccess 文件向 API 项目发出请求时的响应标头:

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
Run Code Online (Sandbox Code Playgroud)

我已经在其他 apache 环境中测试了应用程序设置,它按预期工作......所以这肯定与我的设置有关。这让我疯狂!

有什么想法吗?担

Unb*_*ver 0

如果您仍然有兴趣解决该问题,我有一些建议。配置的基本思想很好,我在一个简单的设置上对其进行了测试,并且标头设置正确。

这意味着问题可能与 htaccess 文件和服务器使用它的能力有关。我首先尝试将“垃圾”放入 htaccess 文件中(任何无效的 Apache 配置)。如果正确读取 htaccess 文件,则导致读取该文件的所有请求都将生成一个 .htaccess 文件500 Internal Server Error

接下来运行apachectl -S并检查输出,如果您不确定,请将其放入您的问题中。您需要确保请求映射到<Directory>问题中的块。恐怕除了搜索配置文件之外您无能为力。当您执行此操作时,请确保AllowOverride 未被某处覆盖。

此外,您正在使用 mod_fastcgi,因此根据您的配置,请求可能根本没有映射到文件系统上的目录,而这是读取 htaccess 文件所必需的。