Здравствуйте!
Недавно решил перенести свой сайт на VPS сервер (nginx+php-fpm), все траблы решил, кроме одной. Блокирую доступ к форме авторизации и админке таким кодом:
allow 111.111.11.11;
deny all;
include /etc/nginx/conf.d/php.conf; #тут подключаю php
}
php.conf выглядит вот так:
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 %{REMOTE_ADDR} !(111.111.111.111|2.222.222.222|33.333.333.333)
RewriteRule .* - [F]
Drupal 7.50, php7.0
Комментарии
Так не должно быть при ЧПУ.
Nginx
Что не должно быть? Такой вид ссылок через q=xxx ? Это не так, эти ссылки никуда не делаются и деться не могут, ибо на самом деле Друпал с ними как раз и работает
ДеЛаются и деться могут. Учим матчасть ЧПУ и штудируем конфиг nginx.
Я правильно понимаю, что в идеале по любому адресу ?q= должно отдавать 404? Или же должен быть редирект на страницу без ?q=? Или что вообще должно получиться?
У меня ЧПУ включены и нормально работают. Но вот этот момент меня настораживает. Получается, что надо блокировать 2 страницы /user и /?q=user
И то, и то будет верным... но в пределах "или".
Все это вполне реализуется через nginx.
Можно и "друпаловским" методом, например редирект с ?q= через модуль Global Redirect. Так же изменить можно стандартный /user - Rename Admin Paths модуль.
?q=user тоже прописать надо, скорее всего только его и хватит, без синонима /user
У вас фактически, нет конфига, для Drupal. Исполнения php файлов совершенно не достаточно.
Стоит изучить матчасть сначала, или хотя бы, взять вот такой конфиг как основу:
https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/
Я как раз его и брал как основу. Я не понимаю, что подразумевается под матчастью? Про что мне нужно прочитать? Какие ключевые отличия конфигурации друпала например, от Wordpress? Что нужно ещё для php в данном случае?
Поставил как временное решение return 403 для админки и входа. Вроде работает, но это явно не выход.
Я предполагаю, что друпал обращается к какому-то файлу в этих каталогах, но я понятия не имею к какому.
Т.е. в том конфиге у вас вставлен ваш приведённый выше кусок?
Тогда надо понимать, что вы не делаете там редиректа на index.php, собственно, и зачем-то подключаете обработчик php, которых у вас в этом локейшене просто нет...
И должен он выглядеть как-то так:
allow 111.111.11.11;
deny all;
rewrite ^ /index.php?$query_string;
}
Ну и дальше это уже пойдёт в нужный локейшен для php файлов и.т.п.
Но, вообще говоря, зачем по ip вайтлистить /user* не понятно. Это не только форма авторизации, во-первых. Во-вторых закрытие формы авторизации не делает ваш сайт неуязвимым, а так, на всякий случай, скорее является бесполезным занятием только приносящим вам же дополнительные неудобства.. Лучше сделать защиту от брутфорса паролей на каком-нибудь fail2ban, например.