Как закрыть XMLHttpRequest от общего доступа?
Использовать одноразовый сессионный ключ, чтобы форсить сценарий: 
«сначала запроси страницу, и только потом — json-данные».
При генерации страницы, на сервере создаётся ключ, который записывается в сессию (на сервере) и в код страницы. 
При запросе данных из страницы, с запросом отправляется и этот ключ, где сравнивается с записанным в сессию. Только при совпадении отдаются данные, а ключ удаляется из сессии.
Чтобы не передавать данные в открытом виде, можно их дополнительно упаковать-зашифровать. См. JSON Web Tokens. Но это чисто декоративно, т.к. всё, что оказывается в итоге в открытом виде в браузере клиента – считай, утекло.
Можно ли как-то сделать так, чтобы никто другой не мог повторить эти запросы и получить мои данные в json-формате?Используй механизмы ссесий. По типу Cookies/JWT. 
P.S. советовал бы JWT отличная лекция   Ильи Климова на эту тему.
Может настройками nginx сделать так, чтобы эти XMLHttpRequest запросы нельзя было выполнить напрямую? Чтобы нельзя было адресу XMLHttpRequest получить данные.nginx это сервер который просто проксирует контент