Рейтинг:0

Настройте NGINX для доставки различного контента JSON на основе $http_referrer.

флаг cn

Я работаю над сервисом + веб-приложение + мобильное приложение, где

  • мобильное приложение используется для потребления контента
  • создано открытым сообществом авторов в веб-приложении
  • при этом все обслуживается сервером, на котором работает Nginx в Ubuntu (ну, некоторые запросы передаются через прокси на серверные серверы Nginx), но это деталь

Проблема, которую я хочу эффективно решить, связана с тем фактом, что контент может быть создан открытое сообщество - почти каждый может нажать несколько кнопок и начать процесс создания контента, в ответ на который сервер генерирует контент-заглушку в виде файла JSON для настройки авторами контента.

Теперь вот проблема: я хочу избежать траты серверного времени и дискового пространства на создание заглушки JSON-контента для авторов, которые начинают процесс, но никогда не выполняют его (перевод = зарегистрироваться, чтобы создать контент, а затем никогда не делать).

Другими словами, я хочу создавать заготовку JSON-контента для авторов только тогда, когда я уверен, что они действительно собираются приступить к процессу его настройки. В то же время я хочу убедиться, что мобильное приложение получает изящную ошибку 404 для содержимого, извлеченного из CDN, которое оно пытается получить через CDN.

Другими словами, есть два набора «потребителей» контента.

  1. Авторы контента, которые обычно запрашивают контент непосредственно с моих серверов через веб-приложение бэк-офиса, которое отображается в NGINX как `$http_reffer = https://example.com/backoffice'
  2. CDN, которая будет пытаться получить тот же контент из того же места в ответ на запросы мобильного приложения.

Ответы по умолчанию для отсутствующего контента:

  1. Авторы контента: Заглушка JSON генерируется и отправляется обратно
  2. CDN: Содержимого JSON-файла не существует, поэтому возвращается заголовок 404.

Решение, которое я имею в виду, находится в следующем блоке конфигурации Nginx.

расположение /cdn/appdata/content
{
 add_header Access-Control-Allow-Origin *;
 если ($http_referer ~* ^https://example.com/backoffice) 
 {
  if (!-e $request_filename) {переписать ^/(.*)$ /pathto/stub-json-generator.php?$1 последним;}
 } 
} еще ??? /* верните существующий JSON или ответьте с кодом 404. Оба запроса к CDN

Время от времени я балуюсь конфигурацией Nginx, но не являюсь экспертом. Мой вопрос - это то, что я наметил достойный способ решения этой задачи, или мне нужно глубже вникать в сценарии Nginx через JS или Lua? Сценарии Lua требуют установки Open Resty, чего я хотел бы избежать, поскольку у меня уже настроен Nginx для работы с NChan и Dart, что затем мне пришлось бы делать снова и снова для Open Resty. Помимо этого, попытка доступа к Redis и Postgres из скрипта Lua приведет меня на незнакомую территорию.


Я мог бы просто удалить этот вопрос, но я оставляю его здесь со своим решением для всех, кто хочет сделать что-то подобное.

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

  • Назначить папку /путь/к/авторским данным символическая ссылка /путь/к/readercontent таким образом
  • ln -s /path/to/authordata /path/to/readercontent

Теперь настройте следующие блоки конфигурации Nginx.

местоположение /путь/к/авторским данным
{
 add_header Access-Control-Allow-Origin *;
 переписать ^(.*)$ /path/to/authordata/index.php?$1 последним;
}

 расположение /путь/к/readercontent
 {
  add_header Access-Control-Allow-Origin *;
 }

Без ведома друг друга эти два блока на самом деле обращаются к одной и той же папке Ubuntu.

Мы используем первый для доступа к данным автора для редактирования. Поскольку содержимое доставляется скриптом PHP, у нас есть возможность генерировать заглушки на ходу. Таким образом, не будет засоряющего сервер содержимого авторской заглушки, которое никогда не будет использоваться по умолчанию.

Мы используем последний, чтобы получить материалы для чтения в мобильное приложение через запрос на вытягивание CDN. Отсутствующий ресурс данных автора приведет к стандартному ответу 404. Заголовок CORS, который мог бы быть более конкретным, препятствует тому, чтобы CDN отбрасывал данные.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.