web-dev-qa-db-ja.com

NGINX 'Access-Control-Allow-Origin'ヘッダーに複数の値が含まれています

PHP( http://myserver.com のホスト名を想定してみましょう)を備えたNGINXサーバーがあります。)PHP = localhostのWebページからXHRを介してアクセスしているスクリプトfreegeoip.netと同様のGeoIPサーバーとして使用しています。

XHRを特定のドメインにロックしようとしています。

これが私の設定です:

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

    fastcgi_param GEOIP_COUNTRY_CODE $geoip2_data_country_code;
    fastcgi_param GEOIP_COUNTRY_NAME $geoip2_data_country_name;
    fastcgi_param GEOIP_COUNTRY_GEONAME_ID $geoip2_data_country_geoname_id;
    fastcgi_param GEOIP_CITY_NAME $geoip2_data_city_name;
    fastcgi_param GEOIP_CITY_GEONAME_ID $geoip2_data_city_geoname_id;
    fastcgi_param GEOIP_CONTINENT_CODE $geoip2_data_city_continent_code;
    fastcgi_param GEOIP_CONTINENT_GEONAME_ID $geoip2_data_city_continent_geoname_id;
    fastcgi_param GEOIP_LATITUDE $geoip2_data_city_location_latitude;
    fastcgi_param GEOIP_LONGITUDE $geoip2_data_city_location_longitude;
    fastcgi_param GEOIP_TIME_ZONE $geoip2_data_city_location_timezone;
    fastcgi_param GEOIP_ISP $geoip2_data_city_traits_isp;
    fastcgi_param GEOIP_IP_ADDRESS $geoip2_data_city_traits_ip_address;

    set $cors "";

    if ($http_Origin ~* 'https?://(www\.domain1\.com|www\.domain2\.com)')
    {
        set $cors "true";
    }

    if ($cors = 'true')
    {
        add_header 'Access-Control-Allow-Origin' "$http_Origin";
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,Pragma,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
    }

    if ($request_method = 'OPTIONS')
    {
        return 204;
    }
}

XHRリクエストを実行すると、次のエラーが発生するという問題があります。

XMLHttpRequest cannot load http://myserver.com/. The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost', but only one is allowed. Origin 'http://localhost' is therefore not allowed access.

設定ファイルのadd_header 'Access-Control-Allow-Origin' "$http_Origin";への呼び出しは1つだけなので、なぜ複数の値があるのですか?最初の呼び出し、つまり*を無効にできる方法はありますか?

10
Obinwanne Hill

1.)アプリケーションに動的に承認させ、応答ヘッダーを追加させます。

$allowed_domains = ['http://allowed.com','http://another_allowed.com'];

function add_cors_header() {
    if (in_array($_SERVER['http_Origin'], $allowed_domains)) {
        header('Access-Control-Allow-Origin', $_SERVER['http_Origin']);
    }
}

2.)または、Luaを有効にしてOpenRestyバージョンのNginxをインストールして同じことを行いますが、LuaはNginx confファイルにあります。

5
chasez0r

したがって、私が犯した間違いは、PHPファイルに次のものが含まれていたことです。

header('Access-Control-Allow-Origin: *');

私はそれを以前にセットアップし、それを取り出すのを忘れていました。

今ではすべてがうまくいきます。

4
Obinwanne Hill