В соответствии с 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
директива и эта ссылка для получения подробной информации об утверждении отрицательного просмотра вперед.