Не работает блокировка по IP (allow IP) на сервере с nginx. Отдаёт ошибку 404, что делать?

Главные вкладки

Аватар пользователя Rokis1234 Rokis1234 22 марта 2017 в 2:35

Здравствуйте!

Недавно решил перенести свой сайт на VPS сервер (nginx+php-fpm), все траблы решил, кроме одной. Блокирую доступ к форме авторизации и админке таким кодом:

location /user {
allow 111.111.11.11;
deny all;
include /etc/nginx/conf.d/php.conf; #тут подключаю php
}

php.conf выглядит вот так:

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

Если пишу site.ru/user - отдаёт 404, если пишу site.ru/?q=user - открывается страница, но при авторизации отдаёт 404. Аналогичная ситуация и с блокировкой админки. Причём ошибка появляется независимо от того, что я в нём прописываю (хоть пустой). На других сайтах (wordpress) всё прекрасно работает. В самом друпале ошибок нет.

Ещё, что странно - блокировка на страницу с контентом (deny all) работает! А allow на ней же - нет! Мне сразу стало понятно, что тут какая-то особенность друпала. Я просто не могу понять какая. В логах ничего необычного не пишется. Как только ставлю комменты на код выше - сразу могу входить. Убираю - 404. С чем это связанно я понятия не имею и поэтому прошу подсказки опытных друпальщиков.

Всё остальное на сайте работает прекрасно (ссылки, обновления и тд), а эту проблему побороть не могу. Задача - просто ограничить по IP форму входа и админку, и разрешить вход с моих IP.

На сервере откуда перенёс (апач), работает данный код:

RewriteCond %{REQUEST_URI} (admin/|/user) [NC]
RewriteCond %{REMOTE_ADDR} !(111.111.111.111|2.222.222.222|33.333.333.333)
RewriteRule  .* - [F]

Drupal 7.50, php7.0

Комментарии

Аватар пользователя jsv jsv 27 марта 2017 в 12:40

Что не должно быть? Такой вид ссылок через q=xxx ? Это не так, эти ссылки никуда не делаются и деться не могут, ибо на самом деле Друпал с ними как раз и работает

Аватар пользователя Rokis1234 Rokis1234 28 марта 2017 в 20:02

Я правильно понимаю, что в идеале по любому адресу ?q= должно отдавать 404? Или же должен быть редирект на страницу без ?q=? Или что вообще должно получиться?

У меня ЧПУ включены и нормально работают. Но вот этот момент меня настораживает. Получается, что надо блокировать 2 страницы /user и /?q=user

Аватар пользователя juto juto 29 марта 2017 в 3:48

И то, и то будет верным... но в пределах "или".
Все это вполне реализуется через nginx.
Можно и "друпаловским" методом, например редирект с ?q= через модуль Global Redirect. Так же изменить можно стандартный /user - Rename Admin Paths модуль.

Аватар пользователя bsyomov bsyomov 28 марта 2017 в 13:14

У вас фактически, нет конфига, для Drupal. Исполнения php файлов совершенно не достаточно.
Стоит изучить матчасть сначала, или хотя бы, взять вот такой конфиг как основу:
https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Аватар пользователя Rokis1234 Rokis1234 28 марта 2017 в 17:09

Я как раз его и брал как основу. Я не понимаю, что подразумевается под матчастью? Про что мне нужно прочитать? Какие ключевые отличия конфигурации друпала например, от Wordpress? Что нужно ещё для php в данном случае?

Поставил как временное решение return 403 для админки и входа. Вроде работает, но это явно не выход.

Я предполагаю, что друпал обращается к какому-то файлу в этих каталогах, но я понятия не имею к какому.

Аватар пользователя bsyomov bsyomov 29 марта 2017 в 19:20

Т.е. в том конфиге у вас вставлен ваш приведённый выше кусок?
Тогда надо понимать, что вы не делаете там редиректа на index.php, собственно, и зачем-то подключаете обработчик php, которых у вас в этом локейшене просто нет...

И должен он выглядеть как-то так:

location /user {
  allow 111.111.11.11;
  deny all;
  rewrite ^ /index.php?$query_string;
}

Ну и дальше это уже пойдёт в нужный локейшен для php файлов и.т.п.

Но, вообще говоря, зачем по ip вайтлистить /user* не понятно. Это не только форма авторизации, во-первых. Во-вторых закрытие формы авторизации не делает ваш сайт неуязвимым, а так, на всякий случай, скорее является бесполезным занятием только приносящим вам же дополнительные неудобства.. Лучше сделать защиту от брутфорса паролей на каком-нибудь fail2ban, например.