Написал я как-то Rest API, сделал чтобы оно было доступно только по HTTPS
, настроил CORS, чтобы любой мог подключаться. Потом написал клиент на JavaScript, который успешно внедрил на существующий сайт. Все здорово, все работает.
IE 9
Internet Explorer 9 не умеет делать CORS запросы через стандартный XMLHttpResuest
. Для того чтобы это победить, нужно использовать XDomainRequest
и то с рядом ограничений. Одно из таких ограничений - запрос на другой сервер можно делать только по тому протоколу, по которому работает клиент. Т.е. если у вас тестовый сайт поднят на http://localhost
, то и данные вы можете слайть только на http://api.sitename.ru
Выключать на сервере API https ради этого мне не хотелось, да и на продашен сервере тоже должен был быть HTTPS, а значит осталось только тестовый express сервер научить работать под 443 портом. Благо, это оказалось довольно просто сделать.
Изначально файл, запускающий сервер выглядел так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | var webpack = require( 'webpack' ) var webpackDevMiddleware = require( 'webpack-dev-middleware' ) var webpackHotMiddleware = require( 'webpack-hot-middleware' ) var config = require( './webpack.config.js' ) var compression = require( 'compression' ) var app = new (require( 'express' ))() var https = require( 'https' ); app.use(compression()) var port = 2000 var compiler = webpack(config) app.use(webpackDevMiddleware(compiler, { stats: { colors: true }, noInfo: true , publicPath: config.output.publicPath })) app.use(webpackHotMiddleware(compiler)) app.get( "/" , function (req, res) { res.sendFile(__dirname + '/index.html' ) }) app.listen(port, function (error) { if (error) { console.error(error) } else { console.info( "==> Listening on port %s. Open up http://localhost:%s/ in your browser." , port, port) } }); |
Я использую Webpack и его фишку HOT Reload модулей, но сейчас не про это.
Для того, чтобы сервер заработал по https, нам сперва потребуется сгенерировать нужные сертификаты. Делается это простой командой:
1 | openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 1000 |
Просто так оно как обычно не заработало, и попросилу указать откуда брать конфиг.
У меня конфиг оказался в GIT папке, видимо и openssl установился вместе с ним.
1 | openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -config "C:\Program Files (x86)\Git\ssl\openssl.cnf" |
Отвечаем на все вопросы. На вопрос о пароле, введите любую комбинацию, которую потом сможете воспроизвести. Я выбрал 1234567890
В папке, из которой вы работаете появятся два файла cert.pem и key.pem
Теперь вернемся к server.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | var webpack = require( 'webpack' ) var webpackDevMiddleware = require( 'webpack-dev-middleware' ) var webpackHotMiddleware = require( 'webpack-hot-middleware' ) var config = require( './webpack.config.js' ) var compression = require( 'compression' ) var app = new (require( 'express' ))(); var https = require( 'https' ); var fs = require( 'fs' ); var port = 443; var host = 'localhost' ; var sslOptions = { passphrase: '1234567890' , key: fs.readFileSync( './key.pem' ), cert: fs.readFileSync( './cert.pem' ) }; var compiler = webpack(config) app.use(webpackDevMiddleware(compiler, { stats: { colors: true }, noInfo: true , publicPath: config.output.publicPath })) app.use(webpackHotMiddleware(compiler)) app.get( "/" , function (req, res) { res.sendFile(__dirname + '/index.html' ) }) https.createServer(sslOptions, app).listen(port) |
Вот в принципе и все. Единственное, что это самоподписанный сертификат и поэтому надо в браузере (на примере FF)
Вот в принципе и все, наслаждайтесь.