2016-10-25 3 views
0

Я разрабатываю приложение Angular 2, которое должно запрашивать api с внешнего сервера, а также запрашивать локальный сервер Apache. Внешний api запрашивается с jsonp и работает отлично. Для локального/внутреннего сервера я хочу использовать http-модуль, потому что оба приложения будут работать на одном сервере.Угловой запрос HTTP серверу apache

Моя проблема заключается в том, что при разработке Angular работает на порту 3000, а Apache работает на порту 80. Если я только установил путь к (например,/some/path), то угловому требуется порт 3000, где нет такой части найти. Таким образом, я установил полный адрес (http://localhost/some/path), но это будет определять как запрос перекрестного происхождения и не допускается.

XMLHttpRequest cannot load http://localhost/gizmo/default-questions/get. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. 

Как я мог сказать, Угловое, что регулярный HTTP порт будет 80. Я думаю, что в будущем, когда все будут строить, это будет не проблема, не так ли? Но я не хочу создавать и заменять его для всех исправлений. Это возможно?

+0

Вам нужно настроить локальный сервер, а не угловой – jonrsharpe

+0

Если порт отличается, это уже CORS. Вам нужно настроить сервер для разрешения запросов CORS. –

ответ

0

Вы должны заставить свой сервер переписывать запросы, чтобы избежать проблем с CORS.

core.gulp.task(TASK,() => { 
    core.browserSync.init({ 
    port: core.config.browserSyncPort, 
    server: { 
     baseDir: (core.config.getMode() === 'start') ? ['.', 'build'] : ['build'], 
     middleware: [ 
     rewrite([ 
      '^/api/(.*)$ ' + core.config.apiPhp + '/$1 [P]', 
      '^/es/(.*)$ ' + core.config.esPhp + '/$1 [P]', 
      '^[^\\.]*$ /index.html [L]' 
     ]) 
     ] 
    }, 
    open: false 
    }); 
    core.browserSync.emitter.on('init',() => { 
    // TODO: Should reload be here or inside timeout? 
    core.browserSync.reload(); 
    setTimeout(() => { 
     let link = core.link(`http://localhost:${core.config.browserSyncPort}`); 
     core.mainHeading(TASK, `CTRL CLICK to open ${link}`); 
    }, 1000); 
    }); 
}); 

Вы можете делать подобные перезаписи в Apache и NGINX. CORS применяется только в браузере.

+0

Должен ли я добавить это к угловому сервису на порту 3000? Где я могу установить его? – CordlessWool

+0

Да, вы устанавливаете его на все, что обслуживает углы .. это может быть Apache nginx или браузер узлов ... синхронизация всех веб-серверов ... перезагрузка сервера ... обычно логика ... если путь URL-адреса URL-адреса запускается/api, тогда отправьте запрос на мой сервер api и т. д. Сервер api может затем обработать его или прокси-сервер на другом сервере. В моем примере кода используется синхронизация браузера в качестве сервера и подключение modrewrite для перезаписи – danday74