当PHP

时间:2019-06-28 20:29:10

标签: php nginx cors http-headers

理想情况下,我想完成此设置:

-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似乎不会发出标头...?如何正确解决此问题?

0 个答案:

没有答案