У меня есть сайт с некоторыми страницами по соединению HTTPS. На этих страницах HTTPS я должен использовать HTTP-запрос Ajax для получения некоторых ошибок, таких как пустые поля. Но сообщения об ошибках не поступают. Есть ли какое-либо решение для этого, или я должен сделать этот запрос AJAX для подключения по протоколу HTTPS?HTTP-запрос Ajax через HTTPS Страница
ответ
Это невозможно из-за Same Origin Policy.
Вам также необходимо переключить запросы Ajax на https.
Даже рабочий проект совместного использования ресурсов Cross-Origin делает невозможным: http://www.w3.org/TR/cors/#user-agent-security – Harmen
Спасибо за ответ всем. Я изменил свой сайт в соответствии с той же политикой происхождения. – cooldude
@NickSotiros Зачем вам это не нужно? Существует нулевой недостаток, и HTTP-запросы на HTTPS-странице потенциально могут быть атакованы MITM для внедрения вредоносного JS. – ceejayoz
В некоторых случаях односторонний запрос без ответа может быть запущен на TCP-сервер без сертификата SSL. Сервер TCP, в отличие от HTTP-сервера, заставит вас запросить. Однако не будет доступа к каким-либо данным, отправленным из браузера, поскольку браузер не будет отправлять какие-либо данные без проверки положительного сертификата. И в особых случаях даже голый сигнал TCP без каких-либо данных достаточно для выполнения некоторых задач. Например, для устройства IoT в локальной сети для запуска подключения к внешней службе. Link
Это своего рода триггер «Wake Up», который работает на порте без какой-либо защиты.
В случае необходимости ответа это может быть реализовано с использованием защищенного общедоступного https-сервера, который может отправить необходимые данные обратно в браузер с использованием, например, WebSockets.
Тем не менее, это может быть сделано с помощью следующих шагов:
отправить запрос Ajax HTTPS на веб-сайте (тот же домен)
jQuery.ajax({ 'url' : '//same_domain.com/ajax_receiver.php', 'type' : 'get', 'data' : {'foo' : 'bar'}, 'success' : function(response) { console.log('Successful request'); } }).fail(function(xhr, err) { console.error('Request error'); });
получить AJAX запрос, для например, php и сделать запрос CURL на любой желаемый веб-сайт через http.
use linslin\yii2\curl; $curl = new curl\Curl(); $curl->get('http://example.com');
Без решения на стороне сервера, Theres только один способ, в котором защищенная страница может получить что-то из незащищенной страницы/запроса и что думала PostMessage и всплывающее
Я сказал всплывающее окно Потому что сайту запрещено смешивать контент. Но всплывающее меню не смешивается. У этого есть свое собственное окно, но он все еще может общаться с новичком с postMessage.
Таким образом, вы можете открыть новый HTTP-страницу с window.open(...)
и есть, что делает запрос для вас (то есть, если сайт использует CORS а)
XDomain пришел на ум, когда я писал но здесь это современный подход с использованием нового fetch api, преимущество потокового больших файлов, недостатком является то, что она не будет работать во всех браузере
Вы помещаете этот прокси-скрипт на любой странице HTTP
onmessage = evt => {
const port = evt.ports[0]
fetch(...evt.data).then(res => {
// the response is not clonable
// so we make a new plain object
const obj = {
bodyUsed: false,
headers: [...res.headers],
ok: res.ok,
redirected: res.redurected,
status: res.status,
statusText: res.statusText,
type: res.type,
url: res.url
}
port.postMessage(obj)
// Pipe the request to the port (MessageChannel)
const reader = res.body.getReader()
const pump =() => reader.read()
.then(({value, done}) => done
? port.postMessage(done)
: (port.postMessage(value), pump())
)
// start the pipe
pump()
})
}
Затем открыть всплывающее окно на странице HTTPS (обратите внимание, что вы можете сделать это только на случае взаимодействия с пользователем или иначе он будет заблокирован)
window.popup = window.open(http://.../proxy.html)
создать свою функцию полезности
function xfetch(...args) {
// tell the proxy to make the request
const ms = new MessageChannel
popup.postMessage(args, '*', [ms.port1])
// Resolves when the headers comes
return new Promise((rs, rj) => {
// First message will resolve the Response Object
ms.port2.onmessage = ({data}) => {
const stream = new ReadableStream({
start(controller) {
// Change the onmessage to pipe the remaning request
ms.port2.onmessage = evt => {
if (evt.data === true) // Done?
controller.close()
else // enqueue the buffer to the stream
controller.enqueue(evt.data)
}
}
})
// Construct a new response with the
// response headers and a stream
rs(new Response(stream, data))
}
})
}
И сделать запрос, как вы обычно делаете с выборкой апи
xfetch('http://httpbin.org/get')
.then(res => res.text())
.then(console.log)
с JavaScript Я попытался из нескольких способов и я не мог.
Вам нужно решение на стороне сервера, например, на C#. Я создал контроллер, который вызывает http, en deserialize, и результат заключается в том, что когда я вызываю из javascript, я делаю запрос от моего https://domain в мой htpps: // домен. Пожалуйста, смотрите мои C# код:
[Authorize]
public class CurrencyServicesController : Controller
{
HttpClient client;
//GET: CurrencyServices/Consultar?url=valores?moedas=USD&alt=json
public async Task<dynamic> Consultar(string url)
{
client = new HttpClient();
client.BaseAddress = new Uri("http://api.promasters.net.br/cotacao/v1/");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
System.Net.Http.HttpResponseMessage response = client.GetAsync(url).Result;
var FromURL = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject(FromURL);
}
И позвольте мне показать вам мою сторону клиента (Javascript)
<script async>
$(document).ready(function (data) {
var TheUrl = '@Url.Action("Consultar", "CurrencyServices")?url=valores';
$.getJSON(TheUrl)
.done(function (data) {
$('#DolarQuotation').html(
'$ ' + data.valores.USD.valor.toFixed(2) + ','
);
$('#EuroQuotation').html(
'€ ' + data.valores.EUR.valor.toFixed(2) + ','
);
$('#ARGPesoQuotation').html(
'Ar$ ' + data.valores.ARS.valor.toFixed(2) + ''
);
});
});
Я желаю, что это поможет вам! Приветствия
ajax должен нормально работать на https, можете ли вы опубликовать свой фактический фрагмент кода? – Manny
Звучит как SOP (http://en.wikipedia.org/wiki/Same_origin_policy): схемы разные, поэтому это другое происхождение. –
Спасибо за ответ. Я изменил свой сайт соответствующим образом. – cooldude