Access-Control-Allow-Origin angularjs для переполнения стека

Мой сценарий состоит из двух веб-серверов, один локальный и один удаленный.

Локальный веб-сервер (Apache) обрабатывает веб-приложение, в котором я хочу сделать ajax-запрос к удаленному веб-серверу (Lighttpd).

Ajax-запрос использует angularjs $ http.

var req = {
method: 'POST',
url: 'http://url/myphp.php',
headers: {
'Authorization': 'Basic ' + btoa('username:password'),
'Content-Type': 'application/x-www-form-urlencoded'
},
xhrFields: {
withCredentials: true
},
crossDomain: true,
data: xmlString
}

$http(req).then(function () {
console.log("OK!");
});

Удаленный PHP-скрипт:

<?php
echo "You have CORS!";
?>

К сожалению, я получил

401 Unhauthorized
XMLHttpRequest cannot load http://url/myphp.php. Response to    preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8888' is therefore not allowed access. The response had HTTP status code 401.

На удаленном веб-сервере включен режим аутентификации .htpasswd и настроен запрос CORS.

Следуйте за частью lighttpd.conf

setenv.add-response-header = ( "Access-Control-Allow-Origin" => "*" )

5

Решение

Чтобы add-response-header работал в lighttpd, вы должны включить mod_setenv в вашем server.modules. Тем не менее, вы должны включить этот mod_setenv до mod_status.

server.modules = (
# ...
"mod_fastcgi",
"mod_rewrite",
"mod_redirect",
"mod_setenv", ## before mod_status
"mod_status",
# ...
)

В качестве альтернативы вы можете использовать PHP для вывода заголовка cors

<?php
header("Access-Control-Allow-Origin: *");
?>

Я также хочу добавить, что если вы отправляете http основные / дайджест-данные аутентификации, вы не можете использовать подстановочные знаки для источника. Вы должны использовать фактический исходный домен

setenv.add-response-header = ( "Access-Control-Allow-Origin" => "example.com" )
setenv.add-response-header = ( "Access-Control-Allow-Credentials" => "true" )
2

Другие решения

Поскольку вы выполняете междоменный POST, Angular делает предварительный запрос OPTIONS, чтобы проверить заголовки Access Origin перед выполнением POST.
Вкладка NET в вашем браузере подтвердит это.
Ваш сервер плохо отвечает на запрос OPTIONS, и поэтому Angular отказывается выполнять POST.

Если вы POST на ваш сервер с POSTMAN все в порядке?

Я считаю, что можно настроить Angular так, чтобы он не делал предполётный запрос.

Либо настройте сервер так, чтобы он правильно отвечал на запросы OPTIONS, в частности возвращая правильные заголовки Access Origin в ответ на запрос OPTIONS. (OPTIONS просто пытается выяснить, установлены ли на вашем сервере эти заголовки, а если нет, зачем создавать POST?)

Надеюсь, эта информация укажет вам правильное направление.

0

* не может быть использован в случае учетных данных.

Сервер игнорирует ваш
setenv.add-response-header заявление.

Смотрите ответ здесь:

CORS: невозможно использовать подстановочный знак в Access-Control-Allow-Origin, когда флаг учетных данных установлен в true

0
По вопросам рекламы [email protected]