2014-01-10 7 views
17

Meine Kolben App macht eine 301 Umleitung für eine der URLs.Flask 301 Antwort

Die Zurückverfolgungs in New Relic ist:

Traceback (most recent call last): 
    File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1336, in dispatch_request 
    self.raise_routing_exception(req) 
    File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1319, in raise_routing_exception 
    raise request.routing_exception 
RequestRedirect: 301: Moved Permanently 

Es sieht nicht wie es auch mein Code trifft oder vielmehr die Zurückverfolgungs wird jede meiner Dateien darin nicht angezeigt. An einem Punkt hatte ich Nginx umleiten alle nicht SSL-Anfrage an HTTPS aber musste deaktivieren, da Varnish konnte nicht die Anfrage an Port 443 ohne einen Fehler zu machen ... wahrscheinlich eine Konfiguration, die ich getan habe oder nicht gemacht.

Es gibt nicht immer eine 301 obwohl, ich kann die URL anfordern und es ohne Probleme bekommen. Aber jemand auf der Welt, der die URL anfordert, bekommt eine 301 Antwort.

Es ist eine GET Anfrage mit einigen benutzerdefinierten Kopfzeilen, um es mit dem Konto zu verknüpfen.

Zu keinem Zeitpunkt in meinem Code gibt es eine 301 Umleitung.

+0

Verwenden Sie etwas wie Flask-Login mit einer sitzungsbasierten Authentifizierungsmethode? In solchen Fällen ist es üblich, mit einem 301 Redirect zum Login-Bildschirm umzuleiten. –

+0

Diese bestimmte Seite ist ein einfaches JSON-Dokument, es ist keine Anmeldung erforderlich, aber ein gültiger API-Schlüssel in den Headern ist. – Nalum

+1

Werkzeug verweist standardmäßig auf die Version mit '/', wenn die Route einem Pfad zugeordnet ist, der auf '/' endet, aber ohne '/' aufgerufen wird. –

Antwort

35

Der Traceback zeigt an, dass es der passende Weg war, der eine Weiterleitung ausgelöst hat; normalerweise (z. B. wenn Sie explizite Weiterleitungsrouten hinzugefügt haben), der Client versucht, auf eine URL (eine, die mit einem Schrägstrich endet) zuzugreifen, aber die angeforderte URL nicht den letzten Schrägstrich enthalten. Der Client wird einfach an den kanonischen Zweig URL mit dem Schrägstrich umgeleitet.

Vom Werkzeug Rule documentation:

URL Regeln, die mit einem Schrägstrich sind Zweig URLs enden, andere Blätter. Wenn Sie strict_slashes aktiviert haben (dies ist der Standardwert), lösen alle Zweigstellen-URLs, die ohne nachgestellten Schrägstrich übereinstimmen, eine Umleitung auf dieselbe URL mit dem angehängten fehlenden Schrägstrich aus.

Vom routing documentation:

Flask URL Regeln basieren auf Werkzeug des Routing-Moduls. Die Idee hinter diesem Modul besteht darin, schöne und einzigartige URLs auf der Grundlage von Präzedenzfällen, die von Apache und früheren HTTP-Servern festgelegt wurden, sicherzustellen.

Nehmen Sie diese zwei Regeln: bei der Nutzung der Schrägstrich in der URL-Definition

@app.route('/projects/') 
def projects(): 
    return 'The project page' 

@app.route('/about') 
def about(): 
    return 'The about page' 

Obwohl sie ziemlich ähnlich aussehen, unterscheiden sie sich. Im ersten Fall hat die kanonische URL für den Projektendpunkt einen abschließenden Schrägstrich. In diesem Sinne ähnelt es einem Ordner in einem Dateisystem. Der Zugriff ohne Schrägstrich führt dazu, dass Flask auf die kanonische URL mit dem nachfolgenden Schrägstrich umleitet.

Im zweiten Fall wird die URL jedoch ohne einen abschließenden Schrägstrich definiert, ähnlich dem Pfadnamen einer Datei auf UNIX-ähnlichen Systemen. Wenn Sie auf die URL mit einem nachgestellten Schrägstrich zugreifen, wird der Fehler 404 "Nicht gefunden" angezeigt.

Mit diesem Verhalten können relative URLs auch dann ausgeführt werden, wenn der abschließende Schrägstrich weggelassen wurde, was mit der Funktionsweise von Apache und anderen Servern übereinstimmt. Außerdem bleiben die URLs eindeutig, was Suchmaschinen dabei hilft, die gleiche Seite zweimal zu indexieren.

Wie dokumentiert, wenn Sie das tun nicht wollen dieses Verhalten (und haben die URL ohne der Schrägstrich ein 404 nicht statt gefunden werden), können Sie die strict_slashes=False Option auf Ihrer Route einstellen müssen.

+0

Vielen Dank, das ist genau das Problem. Danke auch für die Lektüre am Wochenende. – Nalum

+0

Vielen Dank. Du hast mein Leben gerettet. – lmiguelvargasf