Анализ синтаксиса директивы Nginx Location

Nginx

nginx location

Эта статья переведена сWoohoo. Доступно на pc.com/support/thati…

задний план

Nginx locationЭто навык, которым необходимо овладеть в процессе использования nginx, будь то вserver blocksили что-то другоеlocation blocksбудет использоваться в этой статье, эта статья кратко представляет, когда приходит запросlocationКак директивы обрабатываются клиентомURIпросил.

Блочная конфигурация Nginx

Nginx настраивает конфигурацию в виде иерархических отношений в блочной форме. Всякий раз, когда приходит запрос, сервер nginx обрабатывает конфигурацию блока, с которой будет сопоставлен запрос. В файле конфигурации Nginx есть две основные конфигурации блоков:

  • serverконфигурация блока
  • locationконфигурация блокаserverКонфигурация блока содержит ряд конфигураций виртуальных серверов, а конфигурации нескольких серверов могут обрабатывать запросы для нескольких доменных имен, включая порты ip. иlocationнастроен вserverконфигурация блока играет решающую роль в определенииURIИли как должны обрабатываться запросы ресурсов, эти запросы URI могут быть разделены на несколькоlocationКонфигурация

Синтаксис директивы местоположения Nginx

Ниже приведен синтаксический формат часто используемой конфигурации местоположения, гдеmodifierне является обязательным,location_matchЭто ключ к указанию, к какой конфигурации должен перейти URI.

location optional_modifier location_match {
 . . .
}

Regular expressions(RE)или литералы могут использоваться для определенияmodifier, если в конфигурации локации указан модификатор, он может изменить способ сопоставления nginx с локацией Ниже описаны наиболее важные модификаторы:

  • (none)Отсутствие модификатора вообще означает, что локация будет интерпретироваться как совпадение префикса, а для определения совпадения локация будет сопоставляться с начала URI.
  • =Знак равенства означает, что текущая локация будет соответствовать определенному запросу, а конфигурация будет соответствовать любому запросу, при совпадении поиск будет остановлен.
  • ~Знак тильды указывает, что текущее местоположение будет соответствовать RE с учетом регистра.
  • ~*Тильда и звездочка для обозначения местоположения будут сопоставляться с нечувствительным к регистру RE.
  • ^~Если выражение (RE) не совпадает, регулярное выражение не вступит в силу.

Порядок соответствия Nginx Location

Для каждого запроса nginx выберет наиболее подходящее место для обработки запроса. Фактически, nginx выбирает расположение, сравнивая эти правила расположения. Порядок сравнения можно резюмировать следующим образом:

  1. Совпадения префикса (без выражений RE) сопоставляются первыми, и каждое совпадение префикса сопоставляется один раз для текущего запроса.
  2. поиск=Совпадение, если текущий запрос совпадает, поиск остановится и будет использоваться это местоположение напрямую.
  3. Если на втором этапе совпадений нет, nginx продолжит поиск самого длинного совпадения префикса следующим образом: 3.1 Если самое длинное совпадение префикса^~С этим модификатором nginx прекратит поиск и будет использовать это местоположение напрямую. 3.2 Еслинетиспользовать^~, временно сохраните это местоположение и продолжите поиск.
  4. Пока установлено и выбрано самое длинное совпадение префикса, nginx будет проверять, есть ли в текущем местоположении RE с учетом регистра (~и~*), первое совпадение будет рассматриваться как допустимое местоположение для обработки запроса.
  5. Если ни одно местоположение RE не совпадает, для обработки запроса будет выбрано ранее подготовленное местоположение.

Примечание. Таким образом, расположение без модификатора на самом деле является пустой тратой ресурсов, вместо этого вы можете использовать ^~.

Пример

Ниже приведены некоторые примеры конфигурации местоположения, которые используются для подробного описания упомянутой выше последовательности обработки.Вы также можете изменить эти примеры в соответствии с реальной ситуацией.

location  = / {
  #  只处理请求 /.
}
location /data/ {
  # 所有以 /data/ 匹配,但是还会继续搜索.
  # 如果没有其他 location 匹配上,就用这个处理请求.
}
location ^~ /img/ {
  # 所有以 /img/ 开头的请求并且会停止搜索.
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
  # 以png, gif, ico, jpg ,jpeg结尾的请求. 
  # 如果请求是到 /img/ 路径的话 还是会被上面👆的 location 处理
}

Как предотвратить фотографиигорячая ссылка:

location ~ .(png|gif|jpe?g)$ {
  valid_referers none blocked yourwebsite.io *.yourwebsite.io;
  if ($invalid_referer) {
  return   403;
  }
}

Запретить скрипты в доступных для записи каталогах:

location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
  return 403;
}

Для получения дополнительной информации о директиве местоположения nginx, пожалуйста, обратитесь к официальному веб-сайту:Nginx