在我的GAE應用程序(Python)中,我基於請求對象的host
部分實現了多租戶和多站點支持。帶自定義域的Google App Engine通道API
例如,www.foo.com/index.html
和www.bar.com/index.html
都由相同的應用處理(例如myapp.appspot.com
)。該應用程序讀取主機值,然後決定使用哪個名稱空間和站點配置。只要應用程序直接從用戶代理接收請求,此功能就很有用。
但是,我想使用Channel API,但存在一個問題,因爲對/_ah/channel/connected/
和/_ah/channel/disconnected/
的請求不是源自原始用戶代理。相反,請求有Host: myapp.appspot.com
和參數to=myapp.appspot.com
。 (該from
參數是我所期望的令牌。此外www.foo.com/_ah/channel/jsapi
被重定向到沒有記錄,但似乎是爲預期的TalkGadget服務器。)
我認爲,這個問題是由代碼channel.js
導致其不使用原始主機呼叫我的應用程序,例如www.foo.com/_ah/channel/connected
。相反,它使用一個talkgadget.google.com
主機(據我所知)將然後打電話給我的應用程序,但使用myapp.appspot.com
,忽略原來的主機,所以我不能使用請求的host
價值爲我的目的。
作爲一種解決方法,我可以找出將主機信息包含到通道令牌中的方法,因此當我的處理程序接收到令牌時,它們可以使用該令牌。
但是,我想知道是否有更好的方法,我仍然可以獲得原始主機名(例如www.foo.com
)請求/_ah/channel/connected/
和/_ah/channel/disconnected/
。有任何想法嗎?
這是我迄今(帶出任何成功的)嘗試:
添加自定義域名主機名的JS src屬性:
我也試過手動覆蓋通道插口的基礎URL,這裏建議:https://stackoverflow.com/questions/16558776/google-app-engine-channel-api-same-origin-policy
<script type="text/javascript">
onOpened = function() {
// TODO
};
onMessage = function() {
// TODO
};
onError = function() {
// TODO
};
onClose = function() {
// TODO
};
goog.appengine.Socket.BASE_URL = "https://www.foo.com/_ah/channel/";
channel = new goog.appengine.Channel('{{channelToken}}');
socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
</script>
我無法找到任何channel.js官方文檔,我不希望實現一些Google將在下一次更新中輕鬆打破這個問題。
這對我有用: 'goog.appengine.Socket.BASE_URL =「https://www.foo.com/_ah/channel/」;' – Subir