Назад | Перейти на главную страницу

Можно ли нормализовать URL с двойными точками с помощью nginx?

В соответствии с RFC3986 URL как этот

http://example.com/catalog/category/goods/../brand/product.html

преобразованный некоторым UserAgent (curl был бы хорошим примером) в http://example.com/catalog/category/brand/product.html

Как я могу добиться такого поведения с помощью nginx rewrite, если мой тупой UserAgent не может правильно разобрать исходный URL?

Возможно это когда-нибудь или нет?

Вы можете заменить /./ последовательности и /goods/../ последовательности с одним /. Например:

rewrite ^(.*)/\./(.*)$ $1/$2 redirect;
rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 redirect;

В /(?!\.\.)[^/]+/ последовательность должна соответствовать любому элементу пути, который не является другим ... Вышеупомянутые перезаписи рекурсивны и выдают 302 ответа, пока все /./ и /../ последовательности правильно удалены.

В качестве альтернативы того же можно добиться с помощью внутреннего перенаправления, поместив rewrite...last заявления в подходящем location блок. Например:

location / {
    rewrite ^(.*)/\./(.*)$ $1/$2 last;
    rewrite ^(.*)/(?!\.\.)[^/]+/\.\./(.*)$ $1/$2 last;
}

В этом случае URL-адрес, отображаемый в адресной строке браузера, не изменится.

Видеть этот документ для получения подробной информации о rewrite директива и эта ссылка для получения подробной информации об утверждении отрицательного просмотра вперед.