У меня есть NGINX-сервер с PHP (предположим имя хоста http://myserver.com ). У меня есть PHP-скрипт, который я получаю через XHR с веб-страницы на моем локальном хосте. Я использую его как сервер GeoIP, похожий на freegeoip.net.
Я пытаюсь заблокировать 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.) Попросите приложение динамически утвердить и добавить заголовок ответа.
$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.) Или установите версию Nginx OpenResty с включенным Lua и сделайте то же самое, но с Lua в файле конфига Nginx.
Поэтому я сделал ошибку в том, что в своем PHP-файле у меня было следующее:
header('Access-Control-Allow-Origin: *');
Я установил его раньше и просто забыл вытащить его.
Сейчас все отлично.