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

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

我已经在新的开发机器 (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>

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

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)

我还检查了主配置文件和包含的 vhosts 配置文件中的覆盖设置:

<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>

但是,标头未按预期设置。以下是使用上述 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

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

有什么想法吗?Dan

答案1

对于仍然有此问题的所有人来说:对我来说, 在 httpd.conf 文件中进行allowOverride None更改很有帮助allowOverride All

答案2

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

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

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

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

相关内容