Re[2]: В каком порядке обрабатываются location?
А..., вон оно как... А я голову сломал, почему локейшены откуда-то с середины выдергиваются. Еще раз спасибо. >Понедельник, 12 февраля 2018, 17:17 +03:00 от Maxim Dounin >: > >Hello! > >On Mon, Feb 12, 2018 at 04:58:32PM +0300, CoDDoC wrote: > >> >> location /456/ оказался в корне дерева, и поэтому проверяется первым. >> А почему именно этот? Можно поподробнее? > >Потом что он находится в середине списка location'ов, >отсортированного строково. Такой подход позволяет минимизировать >количество необходимых сравнений: если строковое сравнение URI >запроса с /456/ говорит, что URI меньше, то дальнейший поиск >нужного location'а будет делаться только среди location'ов, >которые меньше /456/. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: В каком порядке обрабатываются location?
Hello! On Mon, Feb 12, 2018 at 04:58:32PM +0300, CoDDoC wrote: > >> location /456/ оказался в корне дерева, и поэтому проверяется первым. > А почему именно этот? Можно поподробнее? Потом что он находится в середине списка location'ов, отсортированного строково. Такой подход позволяет минимизировать количество необходимых сравнений: если строковое сравнение URI запроса с /456/ говорит, что URI меньше, то дальнейший поиск нужного location'а будет делаться только среди location'ов, которые меньше /456/. -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: В каком порядке обрабатываются location?
>> location /456/ оказался в корне дерева, и поэтому проверяется первым. А почему именно этот? Можно поподробнее? Спасибо. >Понедельник, 12 февраля 2018, 16:52 +03:00 от Maxim Dounin >: > >Hello! > >On Mon, Feb 12, 2018 at 04:31:18PM +0300, CoDDoC wrote: > >> Доброе время суток! >> Слегка запутался в порядке обработки локейшенов. >> Такая структура: >> >> /1/index.html >> /23/index.html >> /456/index.html >> /7890/index.html >> >> Все файлы index.html, естественно, разные. >> >> Соответственно, тестовый конфиг: >> >> server { >> >> location = /1/ { rewrite ^ /1/index.html break; } >> location = /23/ { rewrite ^ /23/index.html break; } >> location = /456/ { rewrite ^ /456/index.html break; } >> location = /7890/ { rewrite ^ /7890/index.html break; } > >[...] > >> Т.е. работает-то оно правильно, но проверки существующих >> локейшенов почему-то всегда начинаюся с "/456/". Не понимаю, чем >> он такой особенный? Если отталкиваться от длины, так самый >> длинный "/7890/" > >Префиксные location'ы не проверяются последовательно, а строится >дерево, и поиск максимально совпадающего location'а делается >проходом по дереву. В вашем случае location /456/ оказался в >корне дерева, и поэтому проверяется первым. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: В каком порядке обрабатываются location?
Hello! On Mon, Feb 12, 2018 at 04:31:18PM +0300, CoDDoC wrote: > Доброе время суток! > Слегка запутался в порядке обработки локейшенов. > Такая структура: > > /1/index.html > /23/index.html > /456/index.html > /7890/index.html > > Все файлы index.html, естественно, разные. > > Соответственно, тестовый конфиг: > > server { > > location = /1/ { rewrite ^ /1/index.html break; } > location = /23/ { rewrite ^ /23/index.html break; } > location = /456/ { rewrite ^ /456/index.html break; } > location = /7890/ { rewrite ^ /7890/index.html break; } [...] > Т.е. работает-то оно правильно, но проверки существующих > локейшенов почему-то всегда начинаюся с "/456/". Не понимаю, чем > он такой особенный? Если отталкиваться от длины, так самый > длинный "/7890/" Префиксные location'ы не проверяются последовательно, а строится дерево, и поиск максимально совпадающего location'а делается проходом по дереву. В вашем случае location /456/ оказался в корне дерева, и поэтому проверяется первым. -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
В каком порядке обрабатываются location?
Доброе время суток! Слегка запутался в порядке обработки локейшенов. Такая структура: /1/index.html /23/index.html /456/index.html /7890/index.html Все файлы index.html, естественно, разные. Соответственно, тестовый конфиг: server { location = /1/ { rewrite ^ /1/index.html break; } location = /23/ { rewrite ^ /23/index.html break; } location = /456/ { rewrite ^ /456/index.html break; } location = /7890/ { rewrite ^ /7890/index.html break; } location ~ (\.html$|\.php$) { internal; } location "" { return 404; } error_page 404 = @err404; # все, что не соответствует location @err404 { keepalive_timeout 0; rewrite ^ /err/404.html break; } } Из дебага: 2018/02/12 16:02:05 [debug] 11200#11200: *1 http request line: "GET /1/ HTTP/1.1" 2018/02/12 16:02:05 [debug] 11200#11200: *1 http uri: "/1/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "" <<< === здесь ожидалось test location: "/7890/", как локейшен максимальной длины 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/456/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/23/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/1/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 using configuration "=/1/" = 2018/02/12 16:03:05 [debug] 11246#11246: *1 http request line: "GET /23/ HTTP/1.1" 2018/02/12 16:03:05 [debug] 11246#11246: *1 http uri: "/23/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "" <<< === здесь также ожидалось test location: "/7890/", как локейшен максимальной длины 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "/456/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "/23/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 using configuration "=/23/" === 2018/02/12 16:03:51 [debug] 11283#11283: *1 http request line: "GET /456/ HTTP/1.1" 2018/02/12 16:03:51 [debug] 11283#11283: *1 http uri: "/456/" 2018/02/12 16:03:51 [debug] 11283#11283: *1 test location: "" 2018/02/12 16:03:51 [debug] 11283#11283: *1 test location: "/456/" 2018/02/12 16:03:51 [debug] 11283#11283: *1 using configuration "=/456/" = Запрос в несуществующий локейшен 2018/02/12 16:22:47 [debug] 11285#11285: *3 http request line: "GET /7890/ HTTP/1.1" 2018/02/12 16:22:47 [debug] 11285#11285: *3 http uri: "/7890/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "/456/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "/7890/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: ~ "(\.html$|\.php$)" 2018/02/12 16:22:47 [debug] 11285#11285: *3 using configuration "" 2018/02/12 16:22:47 [debug] 11285#11285: *3 rewrite phase: 3 2018/02/12 16:22:47 [debug] 11285#11285: *3 http finalize request: 404, "/7890/?" a:1, c:1 2018/02/12 16:22:47 [debug] 11285#11285: *3 http special response: 404, "/7890/?" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "@err404" 2018/02/12 16:22:47 [debug] 11285#11285: *3 using location: @err404 "/7890/?" .. = Т.е. работает-то оно правильно, но проверки существующих локейшенов почему-то всегда начинаюся с "/456/". Не понимаю, чем он такой особенный? Если отталкиваться от длины, так самый длинный "/7890/" Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru