У меня есть машина на моей локальной сети (machineA), которая имеет два веб-сервера. Первый - встроенный в XBMC (на порту 8080) и отображающий нашу библиотеку. Второй сервер - это сценарий CherryPy Python (порт 8081), который я использую для запуска преобразования файлов по требованию. Преобразование файлов запускается запросом AJAX POST со страницы, обслуживаемой сервером XBMC.
- Перейти к http: // machineA: 8080, который отображает библиотеку
- Библиотека отображается
- Пользователь нажимает на ссылку «конвертировать», которая выполняет следующую команду -
JQuery Ajax Запрос
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- Браузер выдает запрос HTTP OPTIONS со следующими заголовками;
Заголовок запроса - ОПЦИИ
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
- Сервер отвечает следующим:
Заголовок ответа - ОПЦИИ (СОСТОЯНИЕ = 200 ОК)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
- Затем разговор прекращается. Браузер теоретически должен выдавать запрос POST, когда сервер отвечает правильными (?) Заголовками CORS (Access-Control-Allow-Origin: *)
Для устранения неполадок я также выполнил ту же команду $ .post с http://jquery.com . Вот где я в тупике, с jquery.com, почтовый запрос работает, запрос OPTIONS отправляется после POST. Заголовки из этой транзакции ниже;
Заголовок запроса - ОПЦИИ
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://jquery.com
Access-Control-Request-Method: POST
Заголовок ответа - ОПЦИИ (СОСТОЯНИЕ = 200 ОК)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
Заголовок запроса - POST
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache
Заголовок ответа - POST (STATUS = 200 OK)
Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json
Я не могу понять, почему тот же запрос будет работать с одного сайта, но не с другого. Я надеюсь, что кто-то сможет указать, что мне не хватает. Спасибо за вашу помощь!
Ответы:
Я наконец наткнулся на эту ссылку « Запрос CORS POST работает из простого javascript, но почему бы не с jQuery? », В котором отмечается, что jQuery 1.5.1 добавляет
заголовок ко всем запросам CORS. JQuery 1.5.2 не делает этого. Кроме того, в соответствии с тем же вопросом, установка заголовка ответа сервера
не позволяет продолжить ответ. Вы должны убедиться, что заголовок ответа включает в себя требуемые заголовки. то есть:
источник
ЗАПРОС:
ОТВЕТ:
источник
Я решил свою проблему при использовании API матрицы расстояний Google, установив заголовок запроса с помощью Jquery ajax. посмотрите ниже.
Обратите внимание, что я добавил в настройках
**
**
Надеюсь, это поможет.
источник
Мне понадобилось время, чтобы найти решение.
В случае , если ваш ответ сервера правильно и запрос является проблемой, вы должны добавить
withCredentials: true
кxhrFields
в запросе:источник
withCredentials: true
? Вы уверены, что у вас есть соответствующие заголовки?,
версия jquery: 3.2.1`. На самом деле он работает через почтальона, но не проходит через браузер ChromeНу, я боролся с этой проблемой в течение нескольких недель.
Самый простой, самый совместимый и не хакерский способ сделать это, вероятно, использовать JavaScript API провайдера, который не выполняет вызовы через браузер и может обрабатывать запросы Cross Origin.
Например, API JavaScript Facebook и API Google JS.
Если ваш провайдер API не является текущим и не поддерживает заголовок Cross Origin Resource Origin '*' в своем ответе и не имеет API JS (да, я говорю о вас, Yahoo), вы получаете один из трех вариантов:
Использование jsonp в ваших запросах, которое добавляет функцию обратного вызова к вашему URL, где вы можете обработать ваш ответ. Предостережение: это изменит URL запроса, поэтому ваш сервер API должен быть оборудован для обработки? Callback = в конце URL.
Отправьте запрос на ваш сервер API, который является вашим контроллером и находится либо в том же домене, что и клиент, либо с поддержкой перекрестного общего доступа к ресурсам, откуда вы можете передать запрос на сторонний сервер API.
Вероятно, наиболее полезно в тех случаях, когда вы делаете OAuth-запросы и вам нужно обрабатывать взаимодействие с пользователем, ха-ха!
window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')
источник
Использование этого в сочетании с Laravel решило мою проблему. Просто добавьте этот заголовок в ваш запрос jquery
Access-Control-Request-Headers: x-requested-with
и убедитесь, что в ответе на стороне сервера установлен этот заголовокAccess-Control-Allow-Headers: *
.источник
Access-Control-Allow-Headers
и JQ поставляет правильныеAccess-Control-Request-Headers
(плюс все, что вы добавляете через код), ни один из которых не может быть подстановочными знаками. требуется только один «плохой» заголовок, чтобы взорвать предполетный полет, например, использоватьIf-None-Match
для условного GET, если на сервере его нет в списке.По какой-то причине вопрос о запросах GET был объединен с этим, поэтому я отвечу на него здесь.
Эта простая функция будет асинхронно получать ответ о статусе HTTP со страницы с поддержкой CORS. Если вы запустите его, вы увидите, что только страница с правильными заголовками возвращает статус 200, если доступ осуществляется через XMLHttpRequest - используется ли GET или POST. Ничего нельзя сделать на стороне клиента, чтобы обойти это, кроме, возможно, использования JSONP, если вам просто нужен объект json.
Следующее можно легко изменить, чтобы получить данные, хранящиеся в объекте xmlHttpRequestObject:
источник
У меня была точно такая же проблема, когда jquery ajax только давал мне проблемы с корсом при почтовых запросах, где запросы get работали нормально - я устал все выше без результатов. У меня были правильные заголовки на моем сервере и т. Д. Переключение на использование XMLHTTPRequest вместо jquery немедленно решило мою проблему. Независимо от того, какую версию jquery я использовал, это не исправляло. Fetch также работает без проблем, если вам не нужна обратная совместимость с браузером.
Надеюсь, это поможет кому-то еще с такими же проблемами.
источник
Это краткое изложение того, что сработало для меня:
Определите новую функцию (
$.ajax
для упрощения):Использование:
Также работает с
.done
,.fail
и т.д:На стороне сервера (в этом случае, где example.com размещен), установите эти заголовки (добавили некоторый пример кода в PHP):
Это единственный способ, которым я знаю, чтобы действительно POST кросс-домен от JS.
JSONP преобразует POST в GET, который может отображать конфиденциальную информацию в журналах сервера.
источник
Если по каким-то причинам, пытаясь добавить заголовки или установить политику управления, вы все еще не получаете ничего, вы можете подумать об использовании apache ProxyPass…
Например, в том,
<VirtualHost>
который использует SSL, добавьте две следующие директивы:Убедитесь, что следующие модули Apache загружены (загрузите их с помощью a2enmod):
Очевидно, вам придется изменить URL-адрес ваших запросов AJAX, чтобы использовать прокси-сервер apache…
источник
Это немного поздно для вечеринки, но я боролся с этим в течение нескольких дней. Это возможно, и ни один из ответов, которые я нашел здесь, не сработал. Это обманчиво просто. Вот вызов .ajax:
Вот php на стороне сервера:
источник
$.ajax()
правильно настроенный сервер. Самое сложное - получитьAccess-Control-Request-Headers
правильное, но даже это не так уж сложно. Как отмечалось в предыдущих постерах, это должен быть не шаблон, а белый список заголовков.