У меня есть проблема при попытке сделать $ http-вызов на мой php-сервер отдыха.
Я делаю междоменные звонки от клиента к бэкэнду.
Из моего приложения Angular вот так настроена служба $ http:
.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('httpResponseInterceptor');
$httpProvider.interceptors.push('httpTimeStampMarker');
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.headers.post['Access-Control-Allow-Origin'] = '*';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
delete $httpProvider.defaults.headers.common['Content-Type, X-Requested-With'];
}])
Вот как настроен фактический $ http.post ():
// Set the headers
var headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*'
};
return $http({
method: "POST",
url: base_url,
data: $.param(args),
headers: headers
})
.success(function(data, status) {
})
.error(function(data, status) {
});
Это .htaccess сервера:
# Cors
Header add Access-Control-Allow-Origin "*"Header add Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Methods"Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Предварительный запрос проходит нормально:
**Request headers:**
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:access-control-allow-origin, accept, access-control-allow-methods, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:***
Origin:***
Referer:***
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
**Response headers**
Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Methods
Access-Control-Allow-Methods:PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Origin:*
Allow:OPTIONS,GET,HEAD,POST
Connection:Keep-Alive
Content-Length:0
Content-Type:httpd/unix-directory
Date:Fri, 26 Dec 2014 07:12:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.9 (Unix) PHP/5.6.2
Однако фактический почтовый запрос терпит неудачу:
XMLHttpRequest cannot load http://***/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '***' is therefore not allowed access. The response had HTTP status code 404.
Это заголовки запроса и ответа:
**Request headers**
Accept:*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:130
Content-Type:application/x-www-form-urlencoded
Host:***
Origin:http://***
Referer:***
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36**Response headers**
Connection:Keep-Alive
Content-Length:198
Content-Type:text/html; charset=iso-8859-1
Date:Fri, 26 Dec 2014 07:12:24 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.4.9 (Unix) PHP/5.6.2
Я явно пропускаю некоторые заголовки в ответе на запрос поста.
Однако проблема, с которой она не справляется, работает в предварительном запросе. Я попытался добавить некоторые заголовки в index.php остального сервера, но запрос не приходит туда и застревает раньше (я думаю, когда загружен .htaccess).
Что мне здесь не хватает?
Через несколько часов я наконец узнал это.
Мой .htaccess:
# Cors
Header always set Access-Control-Allow-Origin "*"Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Access-Control-Allow-Origin"Header always set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Подсказка @ Алексея Родена была почти правильной. Вместо того, чтобы менять «добавить» на «установить», он должен быть установлен на «всегда установлен».
это сайт выручил меня
Что касается AngularJS, я могу подтвердить, что никакие другие настройки не требуются для работы CORS.
Таким образом, $ http в Angular не нужно менять заголовками или около того, настройки по умолчанию должны работать с записями .htaccess, указанными выше.
Попробуй использовать set
вместо add
на вашем .htaccess
Header set Access-Control-Allow-Origin "*"
Узнать больше Вот