@valentine11

Двойной слеш вместо одного в адресе uri — есть ли разница?

Если по причине какого-то косяка при формировании запроса, скажем, к api, вместо одного слеша в каком-то месте в запросе оказалось два - имеет ли это значение? Будет ли это приводить к рандомным ошибкам или к более длительной обработке запроса сервером? Или к ещё каким-то побочным эффектам?
  • Вопрос задан
  • 1584 просмотра
Пригласить эксперта
Ответы на вопрос 2
Decadal
@Decadal
смотря как сделан роутинг. В большинстве случаев это критичная ошибка, которая приведет к 404 \ 403
Ответ написан
AlekseyArh
@AlekseyArh
Кибер существо
nginx по умолчанию склеивает слэши - merge_slashes off; // on по умолчанию
Это может привести к сюрпризам.

Например если вы используете nginx кэш, ключ кэша строится от урла.
Вы зайдёте на site/page.html, а там закешированна 404, потому что кривой парсер зашёл на site//page.html, а ваш бэк nginxу отдал 404, который он закешировал в ключ md5(site/page.html)

Плюс это кривой запрос на бэк, который в холостую будет искать страницу, который итак понятно что нету.

Вариант лечения, который я вижу на данный момент - это добавить merge_slashes off; перед секцией server
А в начале секции server прописать две регулярки.

rewrite ^//([^/].*) /$1 permanent;
rewrite (.*)//+(.*) /404 permanent;


Первая сработает если вначале ссылки два слеша (site//page.html) и перенаправит на один слэш (site/page.html)
Это распространённая ошибка, например пользователь скопировал относительную ссылку, вставил в адресную строку, а там уже забит домен.
Или парсеры, которые криво парсят.

Вторая регулярка сработает если не сработала первая, и если два и больше слешей есть в оставшемся урле, тогда считаем это ошибкой и редиректим на подготовленную 404 страницу

Это site//page.html исправится на это site/page.html
Это site/cat//page.html на /404
Такой урл site/page.html?utm=https://site не попадает под регулярки.

Можно использовать только одну регулярку
rewrite (.*)//+(.*) $1/$2 permanent;
Тогда все двойные слэши исправятся на одинарные (кроме параметров ссылки)
Но это каждый раз новый редирект. В конечном счёте вы получите ERR_TOO_MANY_REDIRECTS
5fd794a2b921f587081961.png
Лучше так не делать, а просто кривые ссылки считать кривыми.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы