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
на