2016-10-25 76 views
0

我開發了一個Angular 2應用程序,它應該從外部服務器請求一個api,同時也請求一個本地Apache服務器。用jsonp請求外部API,並且工作正常。對於本地/內部服務器,我想使用http模塊,因爲這兩個應用程序都將在同一臺服務器上運行。對apache服務器的角度http請求

我的問題是,實際開發Angular運行在端口3000上,Apache運行在端口80上。如果我只設置路徑(例如/ some/path)Angular請求端口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

您需要配置本地服務器,而不是Angular – 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或節點瀏覽器同步...所有的Web服務器允許服務器重寫...通常的邏輯是...如果http URL請求路徑啓動/ api那麼將請求發送到我的api服務器等.api服務器然後可以處理它或者將它代理到另一個服務器。我的示例代碼使用瀏覽器同步作爲服務器,並連接modrewrite進行重寫 – danday74