理想情况下,我想完成此设置:
-NGINX处理CORS
-我的PHP API脚本仅处理特定于API的响应,仅生成最小的http状态标头。
但是,如果我将所有CORS处理都放到NGINX中,那么如果我的PHP脚本没有运行,它只能 起作用。如果它们运行,将不会生成NGINX中定义的CORS标头。
要解决此问题,要发出CORS标头,我目前有此设置。
... / php.conf
index index.php index.html index.htm;
location ~ \.(php|phar)(/.*)?$ {
fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php-fpm;
# CORS handling for OPTIONS
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
add_header 'Access-Control-Max-Age' 1728000;
return 204;
}
}
和
我必须将标头生成(与上述标头相同)放入我的API中,以通过我的API PHP响应处理它们的发光度。 (响应GET和POST):
$status_header = 'HTTP/1.1 ' . "$status $statusMessage";
header($status_header);
header('Content-type: ' . $content_type);
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD');
header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept');
echo $body;
这有效。但是我不应该在我的API中生成CORS标头。
但是,如上所述,当我不从PHP生成时,而是在NGINX中包含标头-在选项'if'之外,如下所示:
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
add_header 'Access-Control-Max-Age' 1728000;
return 204;
}
仅当我的PHP脚本不运行时才会生成标头。如果它们运行,则不会生成nginx中的标头 added 。它们显示为 replaced ,其中包含我在响应中生成的2个基本标题(状态和类型)。所以..我得到CORS处理OPTIONS请求,但没有处理其他任何事情。在通过预检检查之后,发出请求的客户端会因CORS错误而失败。
虽然Apache没问题,但除非我做错了,否则如果我的响应中包含标头,NGINX似乎不会发出标头...?如何正确解决此问题?