HTTPS работает на localhost, но не для веб-сайтов (virtualhost) [duplicate]

В следующем примере, который я написал, показано, как

  • обрабатывать асинхронные HTTP-вызовы;
  • Подождать ответа от каждого вызова API;
  • Использовать шаблон promise ;
  • Используйте шаблон Promise.All для объединения нескольких HTTP-вызовов;

Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.

Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist для заданного набора строк запроса:

[
 "search?type=playlist&q=%22doom%20metal%22",
 "search?type=playlist&q=Adele"
]

Для каждого элемента новый Promise запустит блок - ExecutionBlock, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user и выполняет новый HTTP-вызов в ExecutionProfileBlock асинхронно.

Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all.

NOTE Recent Spotify search API-интерфейсам потребуется указать токен доступа в заголовках запроса:

-H "Authorization: Bearer {your access token}" 

Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:

var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
    log: function(s) {
        document.getElementById("console").innerHTML += s + "
" } } // Simple XMLHttpRequest // based on https://davidwalsh.name/xmlhttprequest SimpleRequest = { call: function(what, response) { var request; if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } // State changes request.onreadystatechange = function() { if (request.readyState === 4) { // Done if (request.status === 200) { // Complete response(request.responseText) } else response(); } } request.open('GET', what, true); request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken); request.send(null); } } //PromiseAll var promiseAll = function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }; //promiseAll // LP: deferred execution block var ExecutionBlock = function(item, index, resolve, reject) { var url = "https://api.spotify.com/v1/" url += item; console.log( url ) SimpleRequest.call(url, function(result) { if (result) { var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) { return item.owner.href; }) resolve(profileUrls); } else { reject(new Error("call error")); } }) } arr = [ "search?type=playlist&q=%22doom%20metal%22", "search?type=playlist&q=Adele" ] promiseAll(arr, function(item, index, resolve, reject) { console.log("Making request [" + index + "]") ExecutionBlock(item, index, resolve, reject); }, function(results) { // Aggregated results console.log("All profiles received " + results.length); //console.log(JSON.stringify(results[0], null, 2)); ///// promiseall again var ExecutionProfileBlock = function(item, index, resolve, reject) { SimpleRequest.call(item, function(result) { if (result) { var obj = JSON.parse(result); resolve({ name: obj.display_name, followers: obj.followers.total, url: obj.href }); } //result }) } //ExecutionProfileBlock promiseAll(results[0], function(item, index, resolve, reject) { //console.log("Making request [" + index + "] " + item) ExecutionProfileBlock(item, index, resolve, reject); }, function(results) { // aggregated results console.log("All response received " + results.length); console.log(JSON.stringify(results, null, 2)); } , function(error) { // Error console.log(error); }) ///// }, function(error) { // Error console.log(error); });

Я подробно рассмотрел это решение здесь .

15
задан Ammar Hayder Khan 8 October 2014 в 09:48
поделиться

7 ответов

67
ответ дан RiggsFolly 6 September 2018 в 01:14
поделиться

Если у вас есть ошибка примерно так:

Cannot load modules/mod_ssl.so into server: The specified module could not be found.
  1. Возможно, вы захотите попробовать найти libeay32.dll в своей папке с папкой, вы, вероятно, найдете ее в папке {wamp folder} / bin / php / php {version 7} /
  2. Скопируйте файлы libeay32.dll и ssleay32.dll и вставьте их в папку {wamp folder} / bin / apache / apache {version 2.x} / bin / AND { папка wamp} / bin / php / php {verion 5.x}. УБЕДИТЕСЬ, что вы делаете резервное копирование всего, что вы размещаете.
  3. запустите httpd -t и протестируйте синтаксис

ПРИМЕЧАНИЕ. Я считаю, что это связано с ошибкой в ​​части apache openssl для wamp 3.0.6. К счастью, в папке php7 эти библиотеки DLL совместимы для apache и php5.

2
ответ дан Anson Woody 6 September 2018 в 01:14
поделиться

@RiggsFolly: некоторые небольшие ошибки / опечатки / дополнения в вашем учебнике. Ниже используется в сочетании с WAMPServer 2.5 64 бит (Apache 2.4.9 и PHP 5.5.12) в Windows 7 SP1 64 бит:

-httpd-vhosts.conf находится в файле extra / httpd-vhosts.conf

- когда вы пытаетесь отредактировать файл ваших хостов, обязательно отключите любой virusscanner. Некоторые из них блокируют доступ к файлу хостов.

- обязательно откройте текстовый редактор как администратор при редактировании файла хостов или получите ошибку, пытающуюся сохранить.

-don ' t забыть удалить # в начале строки хоста, если есть

, если вы используете WAMPServer 64 бит, обязательно загрузите 64-битную версию OpenSSL

- шаг openssl genrsa -out сайт \ server.key 2048 создает файл server.key, а не файл privkey.pem!

-file \ wamp \ bin \ apache \ apachex.yz \ conf \ httpd-ssl.conf находится в \ wamp \ bin \ apache \ apachex.yz \ conf \ extra \ httpd-ssl.conf (возможно, это зависит от версии WAMPServer)

- Мне пришлось использовать разные порты для http (80-> 8080) и https (443-> 444), поскольку эти порты, где используется, я думаю, Skype. Если вы используете разные порты, обязательно используйте их везде, где вы видите 80 или 443 в этом учебнике

- мне также пришлось включить socache_shmcb_module. «Httpd -t» также упомянул об этом.

2
ответ дан Jan 6 September 2018 в 01:14
поделиться

Необходимо активировать модуль LoadModule socache_shmcb_module modules / mod_socache_shmcb.so в файле httpd.conf в wampserver 2.5. Если не apache выдает следующее сообщение:

AH00526: Синтаксическая ошибка в строке 75 в C: /wamp/bin/apache/apache2.4.9/conf/extra/httpd-ssl.conf: SSLSessionCache: 'shmcb 'кеш сеанса не поддерживается (известные имена:). Возможно, вам нужно загрузить соответствующий модуль socache (mod_socache_shmcb?).

5
ответ дан Juan Diego Trujillo Perez 6 September 2018 в 01:14
поделиться
1
ответ дан Kirill Shur 6 September 2018 в 01:14
поделиться

@RiggsFolly: самоподписанный сертификат с ключом можно легко сгенерировать, например, здесь ... http://www.selfsignedcertificate.com/ , поэтому я мог бы начать учебник с шага 4 ( У меня также был стандарт: 80 виртуальных серверов работает.)

В любом случае некоторые упомянутые вещи уже были включены в настройке по умолчанию WAMP (я думаю, это меняется от версии к версии), но все остальное мне очень помогло. И на самом деле одна вещь отсутствовала ... Мне также пришлось раскомментировать следующую строку в «httpd.conf»

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
1
ответ дан Pěna 6 September 2018 в 01:14
поделиться

Если у вас есть ошибка:

Не удается загрузить модули / mod_ssl.so на сервер: операционная система не может запустить% 1

. Затем у вас есть to:

  1. Установить Win32 OpenSSL здесь http://slproweb.com/products/Win32OpenSSL.html
  2. Скопировать / вставить libeay32.dll, ssleay32.dll в папку wp php bin (C: \ wamp64 \ bin \ php \ php5.6.19)
  3. Перезапустить apache

Примечание: Протестировано на сервере Wamp 3

1
ответ дан Tsounabe 6 September 2018 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: