Ответ 1
вы можете легко перенаправить все запросы с помощью обработчика python. Что-то вроде
class FormHandler(webapp.RequestHandler):
def post(self):
if processFormData(self.request):
self.redirect("http://domain.com")
Как настроить файл app.yaml для перенаправления всех URL-адресов на другой URL-адрес? Например, я хочу http://test.appspot.com/hello или http://test.appspot.com/hello28928723 в перенаправить на http://domain.com.
Я пока обслуживаю только статические файлы. Вот мой файл app.yaml:
application: testapp
version: 1
runtime: python
api_version: 1
handlers:
- url: (.*)/
static_files: static\1/index.html
upload: static/index.html
- url: /
static_dir: static
вы можете легко перенаправить все запросы с помощью обработчика python. Что-то вроде
class FormHandler(webapp.RequestHandler):
def post(self):
if processFormData(self.request):
self.redirect("http://domain.com")
Webapp2 имеет встроенный обработчик перенаправления
Не нужно перематывать свой собственный обработчик; webapp2 уже поставляется с одним.
application = webapp2.WSGIApplication([
webapp2.Route('/hello', webapp2.RedirectHandler, defaults={'_uri':'http://domain.com'}),
webapp2.Route('/hello28928723', webapp2.RedirectHandler, defaults={'_uri':'http://domain.com'}),
], debug=False)
Аргумент _uri - это то, что использует класс RedirectHandler для определения адресата. Чтобы найти документацию по этому вопросу, потребовалось много Google Fu, но оно работает безупречно в моем приложении.
Update:
Я предположил, что вы знаете об этом, но вам нужно изменить свой маршрут на все:
- url: /
static_dir: static
To (версия python27):
- url: /.*
script: main.application
Или: (версия pre python27)
- url: /.*
script: main.py
main.py - это файл, содержащий обработчик запроса + маршруты.
Примечание. Нет способа статического единства для обработки перенаправлений в GAE из-за природы статических файлов. В принципе, нет никакого способа сделать перенаправление только в app.yaml.
Все, что вам нужно (замените app-id
, http://example.com
):
app.yaml
:
application: app-id
version: 1
runtime: python27
api_version: 1
threadsafe: false
handlers:
- url: /.*
script: main.py
main.py
:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class AllHandler(webapp.RequestHandler):
def get(self):
self.redirect("http://example.com", True)
application = webapp.WSGIApplication([('/.*', AllHandler)])
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Вот питон script, который сделает перенаправление:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp.RequestHandler):
def get(self, path):
self.redirect("http://example.com", permanent=True)
def head(self, path):
self.redirect("http://example.com", permanent=True)
application = webapp.WSGIApplication(
[
(r'^(.*)', MainPage)
])
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Если вы хотите использовать только для статических файлов <переадресация > ), сделайте следующее:
В app.yaml поместите это как catch-all, в конец файла:
- url: /.*
static_files: root/redirect.html
upload: root/redirect.html
Затем в файле root/redirect.html поместите это:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;URL=/" />
<script>
location.replace("/");
</script>
</head>
<body></body>
</html>
В этом примере будут перенаправлены все неизвестные URL-адреса на корень (т.е./). Если вы хотите другой URL-адрес, просто замените http://mydomain.com в соответствующих местах.
Отменив ответ Evan, чтобы перенаправить все запросы, вы можете использовать регулярные выражения, чтобы сделать что-то вроде:
import webapp2
from webapp2_extras.routes import RedirectRoute
app = webapp2.WSGIApplication([
RedirectRoute('/<:.*>', redirect_to='/')
], debug=False)
Для официальных документов проверьте:
https://webapp-improved.appspot.com/api/webapp2_extras/routes.html
https://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route. init
Обработчик перенаправления для webapp2 (webapp2.RedirectHandler), упомянутый в предыдущем ответе, не будет работать для пост-запросов, так как он не содержит почтового метода (см. https://github.com/GoogleCloudPlatform/webapp2/blob/master/webapp2.py), поэтому вам придется перевернуть свой собственный обработчик python, если он связан с сообщениями. Что-то вроде следующего:
import webapp2
class MainPage(webapp2.RequestHandler):
def post(self):
self.redirect('http://example.com')
application = webapp2.WSGIApplication([
('/.*', MainPage)
], debug=False)