Как ограничить IP-доступ в nginx - PullRequest
1 голос
/ 11 апреля 2020

Я хочу ограничить доступ по IP для указанного c php файла в Nginx reverse_proxy. поэтому в моем пути к виртуальному хосту /etc/nginx/sites-available/sub.mydmn.com у меня есть следующие настройки:

server {
    server_name wwww.sub.mydmn.com sub.mydmn.com;
    root /home/mydmn/;

    access_log off;

    # Static contents
    location ~* ^.+.(png|mp4|jpeg)$ {
        expires max;
    }

    # Limit IP access
    location = /mine.php {
        allow <MyIP_Here>;
        deny all;
        return 404;
    }

    # Dynamic content, forward to Apache
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}

# Deny server with IP access!
server {
    listen 80 default_server;
    server_name _;
    location / {
    return 403;
    }
}

Но когда я запускаю сервер, Nginx блокирует все IP-адреса для mine.php. В чем проблема?

1 Ответ

1 голос
/ 11 апреля 2020

Nginx выбирает один блок location для обработки запроса (см. этот документ ). Ваш блок location = /mine.php не только возвращает статус 403, если IP-адрес запрещен, но также возвращает статус 404, если IP-адрес разрешен. Требуется, чтобы служба обрабатывала запрос на порту 8080, если разрешен IP-адрес.

Одним из решений является дублирование операторов из блока location /.

Например:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;

location = /mine.php {
    allow ...;
    deny all;
    proxy_pass http://127.0.0.1:8080;
}
location / {
    proxy_pass http://127.0.0.1:8080;
}

Обратите внимание, что операторы proxy_set_header могут быть перемещены во внешний блок, так что они наследуются обоими блоками. Подробнее см. в этом документе .

...