Фляжка 301 Ответ

В моем флеш-приложении выполняется перенаправление 301 для одного из URL-адресов.

След в новой реликвии:

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

Не похоже, что он даже попадает в мой код, или, скорее, трассировка не показывает никаких моих файлов. В какой-то момент у меня было Nginx перенаправить все запросы без SSL на HTTPS, но пришлось отключить это, поскольку Varnish не смог выполнить запрос на порт 443 с ошибкой... возможно, какая-то конфигурация, которую я сделал или не сделал сделать.

Он не всегда возвращает 301, хотя я могу запросить URL-адрес и получить его без каких-либо проблем. Но кто-то из мира, запрашивающий URL-адрес, получает ответ 301.

Это запрос GET с некоторыми пользовательскими заголовками, чтобы связать его с учетной записью.

В моем коде нет ссылки 301.

Ответы

Ответ 1

Отслеживание показывает, что именно сопоставление маршрутов вызвало перенаправление; обычно (например, если вы не добавили явные маршруты перенаправления), это означает, что клиент попытался получить доступ к URL-адресу ветки (тот, который заканчивается конечной косой чертой), но запрошенный URL-адрес не включал последнюю косую черту. Клиент просто перенаправляется на URL-адрес канонической ветки с косой чертой.

В Документация Werkzeug Rule:

Правила URL, которые заканчиваются косой чертой, - это URL-адреса ветвей, другие - листья. Если у вас включен strict_slashes (который по умолчанию), все ветки-адреса, совпадающие без конечной косой черты, вызовут перенаправление на тот же URL-адрес с добавленным отсутствующим косой чертой.

Из документации по маршрутизации:

Правила URL флагов основаны на модуле маршрутизации Werkzeugs. Идея этого модуля заключается в том, чтобы обеспечить красивые и уникальные URL-адреса на основе прецедентов, установленных Apache и более ранними HTTP-серверами.

Возьмите эти два правила:

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

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

Хотя они выглядят довольно схожими, они отличаются использованием конечной косой черты в определении URL. В первом случае канонический URL-адрес для конечной точки проекта имеет завершающую косую черту. В этом смысле он похож на папку в файловой системе. Доступ к нему без завершающей косой черты приведет к тому, что Flask будет перенаправлен на канонический URL-адрес с завершающей косой чертой.

Во втором случае URL-адрес определен без конечной косой черты, скорее как путь к файлу в UNIX-подобных системах. Доступ к URL-адресу с завершающей косой чертой приведет к ошибке 404 "Not Found".

Это позволяет относительным URL-адресам продолжать работать, даже если завершающая косая черта оммитирована, в соответствии с тем, как работают Apache и другие серверы. Кроме того, URL-адреса останутся уникальными, что поможет поисковым системам не индексировать одну и ту же страницу дважды.

Как указано в документе, если вы не хотите этого поведения (и вместо URL-адреса, у которого нет косой черты, вместо 404 Not Found), вы должны установить опцию strict_slashes=False на вашем маршруте.