python nginx flask varnish uwsgi

python - Frasco 301 Respuesta



nginx flask (1)

Mi aplicación de matraz está haciendo un redireccionamiento 301 para una de las direcciones URL.

La traza en New Relic es:

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

No parece que esté golpeando mi código o, más bien, el rastreo no muestra ninguno de mis archivos en él. En un momento dado, hice que Nginx redirigiera todas las solicitudes no SSL a HTTPS, pero tuve que deshabilitarlo porque Varnish no pudo realizar la solicitud al puerto 443 sin un error ... probablemente alguna configuración que hice o no hice.

Sin embargo, no siempre devuelve un 301 , puedo solicitar la URL y obtenerla sin ningún problema. Pero alguien en el mundo que solicita la URL está recibiendo una respuesta 301 .

Es una solicitud GET con algunos encabezados personalizados para vincularla a la cuenta.

En ningún punto de mi código hay una redirección 301 .


El rastreo muestra que fue la coincidencia de ruta la que generó una redirección; por lo general (por ejemplo, a menos que haya agregado rutas de redireccionamiento explícitas), eso significa que el cliente intentó acceder a una URL de sucursal (una que termina con una barra inclinada ), pero la URL solicitada no incluyó la última barra inclinada. El cliente simplemente está siendo redirigido a la URL de la rama canónica con la barra diagonal.

De la documentación de la Rule Werkzeug :

Las reglas de URL que terminan con una barra inclinada son URL de rama, otras son hojas. Si tiene strict_slashes habilitada (que es la strict_slashes predeterminada), todas las URL de las sucursales que coincidan sin una barra diagonal final desencadenarán un redireccionamiento a la misma URL con la barra faltante adjunta.

De la documentación de enrutamiento :

Las reglas de URL de Flask se basan en el módulo de enrutamiento de Werkzeug. La idea detrás de ese módulo es asegurar URL hermosas y únicas basadas en precedentes establecidos por Apache y servidores HTTP anteriores.

Toma estas dos reglas:

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

Aunque se ven bastante similares, difieren en su uso de la barra diagonal final en la definición de la URL. En el primer caso, la URL canónica para el punto final del proyecto tiene una barra diagonal. En ese sentido, es similar a una carpeta en un sistema de archivos. El acceso a él sin una barra diagonal final hará que Flask redirija a la URL canónica con la barra diagonal final.

Sin embargo, en el segundo caso, la URL se define sin una barra diagonal al final, más bien como la ruta de un archivo en sistemas similares a UNIX. El acceso a la URL con una barra diagonal final generará un error 404 "No encontrado".

Este comportamiento permite que las direcciones URL relativas continúen funcionando, incluso si la barra diagonal final es ommited, de acuerdo con la forma en que funcionan Apache y otros servidores. Además, las URL seguirán siendo únicas, lo que ayudará a los motores de búsqueda a evitar la indexación de la misma página dos veces.

Como se documentó, si no desea este comportamiento (y la url sin la barra diagonal final es un 404 No encontrado), debe configurar la opción strict_slashes=False en su ruta.