我已经在新的开发机器 (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 文件所必需的。