Призрак в подкаталоге и через node-http-proxy

Я пытаюсь настроить программу ведения блога Ghost (v0.4) в подкаталоге другого приложения nodejs / express. Мне удалось заставить его работать, выполнив шаги, описанные здесь: https://stackoverflow.com/questions/20431697/node-http-proxy-and-express

Итак, я настраиваю прокси для Ghost из своего основного приложения через Express следующим образом (на моей машине разработчика): '

var proxy = new httpProxy.createProxyServer();
server.get('/blog*', function (req, res, next) {
    proxy.web(req, res, {
        target: 'http://localhost:2368'
    });
});

Это работает для доступа к содержимому блога. Однако, когда я захожу в / blog / ghost / signin и пытаюсь войти в систему, я получаю 404. Насколько я могу судить, страница входа не выходит за пределы каталога blog /, так почему же это могло произойти?

Если я просматриваю блог напрямую (через порт 2368), я могу войти в систему.


person Daren    schedule 29.01.2014    source источник


Ответы (1)


Вы определили маршрут только для GET, поэтому вы проксируете только GET-запросы, но для входа и регистрации используется запрос POST. Обычно правило прокси в Apache или nginx проксирует все разрешенные методы для данного URL-адреса, но, поскольку вы определяете обработчик методом, этого не происходит.

POST-запрос регистрации получает ошибку 404, поскольку он обрабатывается вашим первым узловым приложением, которое не знает, что делать.

В дополнение к POST вам также понадобится метод DELETE, чтобы иметь возможность нажимать на сообщения с уведомлениями и удалять сообщения. Я не уверен, нужны ли и другие методы (OPTIONS), GET, POST и DELETE были единственными, которые я наблюдал, вы увидите, какой метод не работает, если вы посмотрите на запросы, которые выполняет страница, например. с Firebug.

Чтобы исправить это, добавьте тот же обработчик, который вы добавили с помощью get для публикации, а также поместите и удалите:

server.post('/blog*', function (req, res, next) {
    proxy.web(req, res, {
        target: 'http://localhost:2368'
    });
});
server.delete('/blog*', function (req, res, next) {
    proxy.web(req, res, {
        target: 'http://localhost:2368'
    });
});
server.put('/blog*', function (req, res, next) {
    proxy.web(req, res, {
        target: 'http://localhost:2368'
    });
});

Таким образом, интерфейс администратора работает правильно.

person Alex Lehmann    schedule 01.02.2014
comment
Спасибо, это помогло мне продвинуться дальше. Однако теперь, когда я пытаюсь войти в систему, сервер Express некоторое время вращается, а затем умирает с ошибкой: Error: socket hang up at createHangUpError (http.js:1472:15) at Socket.socketCloseListener (http.js:1522:23) at Socket.EventEmitter.emit (events.js:95:17) at TCP.close (net.js:466:12) Я вхожу в вызов server.post, поэтому я знаю, что он зашел так далеко, но я не вижу никаких журналов происходит со стороны Призрака. - person Daren; 02.02.2014
comment
Я решил это. Мне нужно было поставить server.use(express.urlencoded()); server.use(express.json()); после маршрутов, и тогда интерфейс администратора заработал. Спасибо за вашу помощь! - person Daren; 02.02.2014
comment
Вам также необходимо добавить обработчик маршрута PUT. Все остальное работало, но настройки и пользовательские страницы вызывают PUT маршруты. - person Kelly J Andrews; 21.05.2014
comment
Есть ли проблемы с использованием .all, если вы хотите перехватить все HTTP-команды? server.all('/blog*', ... Я делаю нечто подобное. Я вижу интерфейс администратора, но он зависает из-за ошибки сокета, когда пытается аутентифицировать пользователя. - person user3233032; 24.04.2015