Nginx-несколько/вложенных операторов IF

что я хочу сделать:

  • проверьте, если запрос поступает из Facebook
  • Проверьте, похож ли URL domain.com/2
  • Если вышеуказанные условия истинны-показать содержимое из / api / content / item / $1?social=1
  • Если вышеуказанные условия ложны-показать "нормальную страницу"

это одностраничное приложение. Перед моими изменениями конфигурация выглядела так (и она работала):

location / {
    root /home/eshlox/projects/XXX/project/project/assets/dist;
    try_files $uri $uri/ /index.html =404;
}

Я пытался использовать, если заявления:

location / {
    set $social 1;
    if ($http_user_agent ~* "facebookexternalhit") {
        set $social UA; 
    }       
    if ($uri ~* "^/(d+)$") {
        set $social "${social}URL";
    }       
    if ($social = UAURL) {
        rewrite ^/(d+)$ /api/content/item/?social=1;
    }

    root /home/eshlox/projects/XXX/project/project/assets/dist;
    try_files $uri $uri/ /index.html =404;
}

в такой конфигурации все работает, как я ожидал, только если оба условия истинны или ложны. Если одно из условий истинно, а второе ложно (или наоборот), то nginx всегда возвращает статус 404.

Я нашел "IfIsEvil" на сайте nginx, я попытался использовать mapping (могу ли я использовать mapping в этом случае?) но я все еще не могу решить эту проблему.

какие идеи?

С наилучшими пожеланиями.

1 ответов


есть хорошая статьи об общих подводных камнях в nignx wiki.

во-первых, я переехал root директива на уровень сервера. Во-вторых, location это лучший способ проверить URL-адреса. Поэтому я переосмысливаю ваши требования как

  • если расположение состоит из цифр
  • и запрос от facebook

мы должны переписать url, и результат:

root /home/eshlox/projects/XXX/project/project/assets/dist;

location / {
    try_files $uri $uri/ /index.html;
}

location ~ "^/\d+$" {
    if ($http_user_agent ~* "facebookexternalhit") {
        rewrite (.+) /api/content/item?social=1;
    }

    try_files $uri $uri/ /index.html;
}

кроме того, почти нет причин иметь =404 после /index.html на