как точное совпадение местоположения работает в nginx?

В приведенном ниже коде директива index добавляет page1.htm к / запросам. Поэтому я ожидаю, что точное совпадение для http://DOMAIN будет соответствовать второму блоку местоположения, а не первому.

index page1.htm;

location = /
    {
    rewrite / /page2.htm;
    }

location = /page1.htm
    {
    rewrite /page1.htm /page3.htm;
    }

Но это первое подходящее место. http://DOMAIN дает мне page2.htm, а http://DOMAIN/page1.htm дает мне page3.htm.

Какое точное соответствие обеспечивает префикс =?

Я просмотрел много документов, но мне не ясно, что здесь происходит. Если первое местоположение удалено, то http://DOMAIN дает мне page3.htm, поэтому кажется, что он использует индекс перед попыткой сопоставления местоположения. Итак, в приведенном выше случае, почему location = / соответствует, когда после применения индекса uri стал /page1.htm?

Проверяются ли места сначала без применения индекса, а затем, только если совпадений нет, проверяются ли они снова с применением индекса?


person poby    schedule 10.02.2016    source источник
comment
То, что вы считаете http://DOMAIN запросом, на самом деле является http://DOMAIN/ запросом. Вот как работает HTTP-протокол, часть пути не может быть пустой, это всегда минимум одна косая черта (/).   -  person Alexey Ten    schedule 10.02.2016
comment
Да, я знаю это. По-прежнему не объясняет, как применяется индекс с точным соответствием, как описано выше.   -  person poby    schedule 10.02.2016


Ответы (3)


Я публикую ответ на случай, если кто-то еще исследует этот довольно неясный вопрос. Дальнейшее тестирование показывает следующее:

  1. Когда uri поступает в серверный блок, он анализируется по расположениям без применения какой-либо директивы index.

  2. Если результирующий путь разрешается в допустимый каталог и существует директива index, имена файлов в индексе последовательно добавляются к пути и проверяются на наличие действительного файла.

  3. Если шаг 2 приводит к изменению пути (путем добавления существующего имени файла индекса), местоположения снова анализируются с новым путем.

person poby    schedule 10.02.2016

URL-адреса http://example.com и http://example.com/ на самом деле абсолютно одинаковы для HTTP. Оба будут отправлены как

GET / HTTP/1.1
Host: example.com
... other headers

это означает, что часть пути никогда не бывает пустой и всегда начинается с косой черты /. И в этом случае совершенно очевидно, что ваш запрос к http://example.com заканчивается page2.htm.

По шагам:

  1. Nginx нашел точное совпадение / и переписал запрос на /page2.htm
  2. Нет местоположения, совпадающего с /page2.htm, поэтому nginx просто обработал статический файл.

Вы могли видеть, что index здесь никогда не использовалось.

person Alexey Ten    schedule 10.02.2016
comment
Я думаю, вы упустили суть вопроса. Я уже знаю все, что вы только что написали, но это не решает проблему. Вопрос в том, когда применяется директива index? Прочитайте мой вопрос еще раз. Если первое местоположение удалено, то будет отправлена ​​страница 3, даже если путь будет только «/». Таким образом, в этом случае индекс применяется к пути до того, как он будет проанализирован. Единственное, что имеет смысл, это то, что местоположения сначала анализируются без директивы index, а если нет совпадений, снова анализируются с помощью директивы index. Так это работает? - person poby; 10.02.2016
comment
index работает, когда nginx обнаруживает, что ваш запрос попадает в каталог. Поэтому, если вы запросите /some/dir/, у вас есть каталог $document_root/some/dir/, тогда nginx попытается добавить имена файлов из index и искать файлы. Если файл найден, nginx добавит это имя файла к запросу (будет /some/dir/index.htm) и сделает внутреннюю переадресацию. - person Alexey Ten; 10.02.2016
comment
Другими словами, если путь является каталогом, то местоположения сначала анализируются без применения индекса, а затем, если нет совпадения, снова анализируются с примененным индексом? - person poby; 10.02.2016

В документации nginx это довольно ясно:

Местоположение может быть определено строкой префикса или регулярным выражением. Регулярные выражения указываются с предшествующим модификатором «~*» (для сопоставления без учета регистра) или модификатором «~» (для сопоставления с учетом регистра). Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с помощью строк префикса (префиксные местоположения). Среди них выбирается и запоминается местоположение с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в конфигурационном файле. Поиск регулярных выражений завершается при первом совпадении, и используется соответствующая конфигурация. Если совпадение с регулярным выражением не найдено, то используется запомненная ранее конфигурация расположения префикса.

...

Также с помощью модификатора «=» можно определить точное совпадение URI и местоположения. Если найдено точное совпадение, поиск прекращается.

person funky-future    schedule 26.07.2017