Используйте Nginx для сервера разных страниц в зависимости от IP-адреса / подсети

8

По отвратительным причинам ... Я использую Nginx в качестве веб-сервера и хотел бы, чтобы он обслуживал одну страницу для внутренних пользователей (скажем, 10.0.0.0/16) и другую страницу для внешних пользователей на любом другом IP-адресе.

Например:

  • «Внутренний» ПК с IP-адресом 10.0.0.34 переходит на company.com/page.html получает страницу internal.html

  • «Внешний» ПК с IP-адресом 8.8.8.8 переходит на company.com/page.html получает страницу external.html

Джон Роудс
источник
2
Уточнить; Использование Nginx не отвратительно, мне нужно это! Nginx великолепен!
Джон Роудс

Ответы:

13

Использование Сделать из Nginx модуля гео . Это позволяет вам установить значение переменной на основе IP-адреса клиента. geoДиректива должна быть в httpразделе:

http {
  geo $client {
    default extra;
    10.0.0.0/8 intra;
  }

Вы можете использовать его позже в местах для поиска файлов

location / {
  try_files $uri.$client $uri = 404;
}

Какие средства, Nginx будет установлена $clientлибо extraили на intraоснове IP клиента. Давайте предположим, что это интранет-клиент. Если клиент запрашивает page.html, Nginx будет искать файл /your/root/page.html.intra. Если такого файла нет, он будет искать /your/root/page.html. Если он не может найти ни одного из них, Nginx возвращает 404 «Not Found» ответ. Подробнее о "try_files" в документации

Кстати, indexдиректива также поддерживает переменные. Например

index index.$client.html index.html;
Александр Азаров
источник
2
Работал хорошо - я закончил тем, что делал location = / filename & rewrite ^ /filename.$client last;
Джон Роудс