2016-08-15 1 views
7

У меня есть сервер NGINX с PHP (предположим, что имя хоста http://myserver.com). У меня есть PHP-скрипт, который я получаю через XHR с веб-страницы на моем локальном хосте. Я использую его как сервер GeoIP, похожий на freegeoip.net.Заголовок NGINX «Access-Control-Allow-Origin» содержит несколько значений

Я пытаюсь заблокировать 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"; в файле конфигурации, так почему у меня есть несколько значений? Есть ли способ отключить первый вызов, то есть *?

ответ

3

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.) Или установить версию OpenResty из Nginx с Lua включен и сделать то же самое, но с Lua в конф файле Nginx.

+0

Спасибо. Ваша рекомендация (1.) указала мне на мою ошибку. –

3

Так ошибка, которую я сделал, что я имел следующий в моем PHP файл:

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

я поставил его раньше, и просто забыл принять его.

Все отлично работает сейчас.

Смежные вопросы