我怎樣才能防止用戶在訪問example.appspot.com我的應用程序,並強迫他們在example.com訪問它?我已經有了example.com的工作,但我不希望用戶能夠訪問appspot域。我正在使用python。塊請求* .appspot.com的,並迫使自定義域在谷歌應用程序引擎
回答
你可以檢查是否os.environ['HTTP_HOST'].endswith('.appspot.com')
- 如果是這樣,那麼你從something.appspot.com
提供服務,並可以發送重定向,或根據需要改變你的行爲。
您可以以各種方式(裝飾器,WSGI中間件,繼承自您的中間基類的子類webapp.RequestHandler
[[或者你目前正在使用],比獲得不同的崗位在您的應用程序級的處理程序類的方法名,還有一些),但我認爲,這裏的關鍵思想是:os.environ
由app引擎設置等基本處理程序類框架根據CGI標準,所以你可以依賴這些標準(類似的,WSGI根據它從os.environ中獲得的值構建自己的環境)。
def redirect_from_appspot(wsgi_app):
def redirect_if_needed(env, start_response):
if env["HTTP_HOST"].startswith('my_app_name.appspot.com'):
import webob, urlparse
request = webob.Request(env)
scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
url = urlparse.urlunsplit([scheme, 'www.my_domain.com', path, query, fragment])
start_response('301 Moved Permanently', [('Location', url)])
return ["301 Moved Peramanently",
"Click Here" % url]
else:
return wsgi_app(env, start_response)
return redirect_if_needed
你會如何將其與應用程序集成? – 2009-09-24 20:50:59
得到這個工作,但我不認爲這是可能使其與靜態內容的工作,所以仍然會通過Appspot上(和所有的各種version'd子域):-( – 2009-12-19 18:43:29
這個代碼不處理SSL訪問或cron作業我已經在一個新的答案中發佈了一個稍微修改過的版本 – 2009-12-30 12:45:54
上面貼的代碼有兩個問題 - 它設法重新安全流量(不支持自定義域),以及您的cron作業會失敗時,谷歌稱他們對你Appspot上域和您服務一個301
我貼一個稍作修改的版本到我的博客: http://blog.dantup.com/2009/12/redirecting-requests-from-appid-appspot-com-to-a-custom-domain
我已經包括下面爲了方便代碼。
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
def run_app(url_mapping):
application = webapp.WSGIApplication(url_mapping, debug=True)
application = redirect_from_appspot(application)
run_wsgi_app(application)
def redirect_from_appspot(wsgi_app):
"""Handle redirect to my domain if called from appspot (and not SSL)"""
from_server = "dantup-blog.appspot.com"
to_server = "blog.dantup.com"
def redirect_if_needed(env, start_response):
# If we're calling on the appspot address, and we're not SSL (SSL only works on appspot)
if env["HTTP_HOST"].endswith(from_server) and env["HTTPS"] == "off":
# Parse the URL
import webob, urlparse
request = webob.Request(env)
scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
url = urlparse.urlunsplit([scheme, to_server, path, query, fragment])
# Exclude /admin calls, since they're used by Cron, TaskQueues and will fail if they return a redirect
if not path.startswith('/admin'):
# Send redirect
start_response("301 Moved Permanently", [("Location", url)])
return ["301 Moved Peramanently", "Click Here %s" % url]
# Else, we return normally
return wsgi_app(env, start_response)
return redirect_if_needed
感謝,部署了您的代碼(+1)。我想知道Google爲什麼不提供內置解決方案,因爲他們通常會鼓勵這樣的良好實踐作爲url規範化 – jholster 2010-04-25 08:21:49
我想知道同樣的事情,實際上很煩人不得不將這些代碼放到我的所有應用程序中(並更改域名):-( – 2010-05-02 16:57:24
如果您正在使用webapp2,一個稍微容易(取決於你的使用情況)解決方案,可以使用其DomainRoute
。
如果這是你的URL映射:
url_map = [
('/', HomeHandler),
('/about', AboutHandler),
('/admin/(.+)', AdminHandler),
MailForwardHandler.mapping(),
]
application = webapp2.WSGIApplication(url_map, debug=True)
,管理員和郵件應該不重定向,然後添加重定向路徑如下:
from webapp2_extras import routes
url_map = [
routes.DomainRoute('appid.appspot.com', [
routes.RedirectRoute('/', redirect_to='http://app.com', schemes=['http']),
routes.RedirectRoute('/about', redirect_to='http://app.com/about', schemes=['http']),
],
('/', HomeHandler),
('/about', AboutHandler),
('/admin/(.+)', AdminHandler),
MailForwardHandler.mapping(),
]
application = webapp2.WSGIApplication(url_map, debug=True)
此意願,指定,只重定向http,而不是 https。它根據需要使用永久重定向(301)。
您也可以將一個函數傳遞給redirect_to
,as described in the documentation,當你有很多規則時,這應該更容易。
您可以通過覆蓋在webapp2.RequestHandler
基類中的方法initialize
通過以下方式將其重定向到您的自定義域(這裏example.com
):
def initialize(self, *a, **kw):
webapp2.RequestHandler.initialize(self, *a, **kw)
if self.request.host.endswith('appspot.com'):
self.request.host = 'example.com'
self.redirect(self.request.url, permanent=True)
- 1. Python /谷歌應用程序引擎自我請求域
- 2. 在谷歌應用程序引擎的自定義域
- 3. 谷歌應用程序引擎和自定義子域
- 4. 在谷歌應用程序引擎
- 5. 完全自定義登錄谷歌應用程序引擎
- 6. 自定義登錄谷歌應用程序引擎
- 7. 用於自定義域配置谷歌應用程序引擎SSL
- 8. 谷歌應用程序引擎:預熱/載入的請求,並始終在
- 9. 谷歌自定義域不路由到應用引擎站點
- 10. 自定義傳入郵件域與谷歌應用程序引擎
- 11. Django的谷歌應用程序引擎
- 12. 取消谷歌應用程序引擎端點請求
- 13. 谷歌應用程序引擎請求日誌擊穿
- 14. 如何使用自己的域名谷歌應用程序引擎
- 15. 谷歌應用程序引擎 - 找出當前請求達到app引擎
- 16. 如何在自定義域上提供appspot.com應用程序?
- 17. 在谷歌應用程序引擎
- 18. 配置谷歌應用程序引擎應用程序的跨域
- 19. 使用python的谷歌應用引擎的自定義插件
- 20. 谷歌應用程序引擎_method?
- 21. Mongodb python谷歌應用程序引擎
- 22. 谷歌應用程序引擎使用谷歌Apps的非主域
- 23. 在谷歌應用程序引擎
- 24. 在cygwin谷歌應用程序引擎
- 25. 在谷歌應用程序引擎
- 26. 在谷歌應用程序引擎SDK
- 27. java.lang.ClassNotFoundException:sun.security.provider.Sun在谷歌應用程序引擎
- 28. 谷歌應用程序引擎 - 在
- 29. 櫟在谷歌應用程序引擎
- 30. 在谷歌應用程序引擎
感謝,正是我一直在尋找。 – 2009-09-01 22:32:05
@Alex Martelli:Django會如何? http://stackoverflow.com/questions/35286042/redirect-appspot-com-to-custom-domain-google-app-engine-django – 2016-02-09 07:41:29
的'<鏈接的rel = 「規範」'上是Q答案似乎是正確的。 – 2016-02-09 15:07:17