Мой сценарий состоит из двух веб-серверов, один локальный и один удаленный.
Локальный веб-сервер (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" => "*" )
Чтобы 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" )
Поскольку вы выполняете междоменный POST, Angular делает предварительный запрос OPTIONS, чтобы проверить заголовки Access Origin перед выполнением POST.
Вкладка NET в вашем браузере подтвердит это.
Ваш сервер плохо отвечает на запрос OPTIONS, и поэтому Angular отказывается выполнять POST.
Если вы POST на ваш сервер с POSTMAN все в порядке?
Я считаю, что можно настроить Angular так, чтобы он не делал предполётный запрос.
Либо настройте сервер так, чтобы он правильно отвечал на запросы OPTIONS, в частности возвращая правильные заголовки Access Origin в ответ на запрос OPTIONS. (OPTIONS просто пытается выяснить, установлены ли на вашем сервере эти заголовки, а если нет, зачем создавать POST?)
Надеюсь, эта информация укажет вам правильное направление.
*
не может быть использован в случае учетных данных.
Сервер игнорирует ваш
setenv.add-response-header
заявление.
Смотрите ответ здесь: