хитровымудренных реврайтов и проксипассов на локейшенах, нужно (если грубо) редиректить с /asd на /asd/, и с /a.s/d?var=1 на /a.s/d/?var=1, сделал так:
# Первое правило для URL без / и с GET параметрами, исключая /rest, /upload, /_next и URL с точкой справа от последнего слеша
location ~ ^((?!/rest|/upload|/_next|^.*/[^?/]+\.[^?/]+$)[^\?]*[^/])\?(.*)$ {
return 301 https://$host$1/$is_args$args;
}
# Второе правило для URL без / и без GET параметров, исключая /rest, /upload, /_next и URL с точкой справа от последнего слеша
location ~ ^((?!/rest|/upload|/_next|^.*/[^?/]+\.[^?/]+$)[^\?]*[^/])$ {
return 301 https://$host$1/$is_args$args;
}
Почти работает: ретурн не возвращает моментально клиенту редирект, а успевает его испортить нижележащими правилами, до которых даже не должно доходить: когда есть матч с этими 2 локейшенами, нужно просто сразу отдать 301 и закрыть коннект. ЧЯДНТ?
1. прочитай правила, пожалуйста 2. конфиги - на pastebin.com 3. включи debug_connection и посмотри, что происходит
тут, собственно, конф и не нужен, суть вопроса - можно ли как-то тут же вернуть 301, и тут же закрыть соединение, не ломая локейшен дальнейшими реврайтами? или почему return допускает обработку ниже по конфигу, а не завершает обработку соединения сразу? по доке вроде бы это сразу на return должно происходить, а у меня дальнейшие реврайты успевают урл поломать
теперь перечитай то, что ты написал и осознай, что написал х... ерунду
Без человеческого/живого блока location сложно подсказать. Само по себе, директива location имеет одну особенность: Если location задан префиксной строкой со слэшом в конце и запросы обрабатываются при помощи proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass или grpc_pass, происходит специальная обработка. В ответ на запрос с URI равным этой строке, но без завершающего слэша, будет возвращено постоянное перенаправление с кодом 301 на URI с добавленным в конец слэшом. Если такое поведение нежелательно, можно задать точное совпадение URI и location, например: location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; } Возможно, будет полезно.
полностью согласен, понимал бы - и вопроса не возникло)
вот и выполни вышеуказанные пункты. глядишь, и вопрос отвалится ...
Обсуждают сегодня