Вопрос по – Как перенаправить все URL с помощью Google App Engine

19

Как настроить файл app.yaml для перенаправления всех URL-адресов на другой URL-адрес? Например я хочуhttp://test.appspot.com/hello или жеhttp://test.appspot.com/hello28928723 перенаправить наhttp://domain.com.

В данный момент я работаю только со статическими файлами. Вот мой файл app.yaml:

<code>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
</code>

Ваш Ответ

7   ответов
0

упомянутый в предыдущем ответе, не будет работать для запросов на публикацию, так как он не содержит метод публикации (см.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)
8

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()
предложить добавить & quot; безопасный: необязательный & quot; в обработчик app.yaml, чтобы https также работал.
& quot; безопасный: необязательный & quot; по умолчанию, если не указано (cloud.google.com/appengine/docs/python/config/…)
5

. Что-то вроде

class FormHandler(webapp.RequestHandler):
  def post(self):
    if processFormData(self.request):
      self.redirect("http://domain.com")
Этот ответ неполон - этот фрагмент кода сам по себе недостаточен для перенаправления запросов. Кроме того, как насчет получения запросов?
@BrianLeathem Только что опубликовалcomplete example.
0

чтобы перенаправить все запросы, вы можете использовать регулярные выражения, чтобы сделать что-то вроде:

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

3

static-files-only способ сделать "перенаправления" затем сделайте это:

В app.yaml, поместите это как ловушку, в конце файла:

-   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 в соответствующих местах.

40

Webapp2 has a built-in redirect handler

Не нужно накатывать собственный обработчик; 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

Кому (версия python27):

- url: /.*
  script: main.application

Или: (до Python27 версия)

- url: /.*
  script: main.py

main.py - это файл, содержащий обработчик запроса + маршруты.

Note: There is no static-only way to handle redirects on GAE because of the nature of static files. Basically, there's no way to do a redirect in app.yaml alone.

Это обрабатывает get / post / etc ... Это в основном "правильные" слова. способ сделать 301 (постоянный) перенаправление в GAE.
Важно отметить, что, по-видимому, App Engine не поддерживает перенаправление в статические файлы / каталоги. Я не смог получить перенаправление на работу. Я продолжал получать эти ошибки в своих журналах: & quot; Файл, на который ссылается обработчик, не найден: main.app & quot ;. Наконец, я нашел это, что подтвердило, что статические файлы не доступны для обработчиков:stackoverflow.com/questions/8734040/….
Я думаю, что hello28928723 был просто примером, он хотел перенаправить все запросы.
@StephenKaiser Технически, это не перенаправление, но вы можете определить новый маршрут в app.yaml, который указывает от старого URI на новый. Из-за архитектуры и способа обработки статических файлов невозможно определить фактическое перенаправление 301/302 для статических файлов.
@Jonny Существует значительная разница между обработкой статических и нестатических файлов в GAE. Вы можете добавить нестатический дескриптор в список над статическим обработчиком, чтобы перехватывать только перенаправления. В любом случае важно понимать, как и почему статические файлы обрабатываются по-разному в GAE. App.yaml - это в основном набор инструкций для обратного прокси, где все статические файлы фактически хранятся в статическом файловом кеше отдельно от нестатических файлов. Переадресация 302/301 невозможна до тех пор, пока вы не попадете на http-сервер (т.е. не в статический кеш).
4

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()
Обратите внимание, что ответ webapp2, предоставленный @Evan Plaice, работает, но я застрял в старом хранилище данных и не смог использовать python 2.7.
+1 за размещение решения, обратно совместимого с webapp.

Похожие вопросы