Pull to refresh

Comments 30

location / {
               if ( $request_uri ~* /wp-login.php) {
....

Что это за лапша?!
Почему не
location /wp-login.php {
limit_req  zone=login burst=4;
proxy_pass        http://backend:8080;
<...>
}
В примере с Nginx можно защитить любую подстроку, не зная наперед в корне или подкаталоге она располагается. Этим конфигурационным файлом не только wordpress закрыть можно.

И да, наверное стоило в конфигурационном примере для haproxy сделать так же, воспользовавшись path_sub вместо path_beg.
Если расскажите как иначе подружить location ~* с proxy_pass, буду очень благодарен.
savostin прав. Вам следует убрать if и сделать, основываясь на вырезке из документации
Если location задан регулярным выражением.

В этом случае директиву следует указывать без URI.

так (привожу пример из своей работающей на nginx-1.6.2 конфигурации, приведите сами к своей):
upstream oldsites {
        server 127.0.0.1:8081;
}
location ~* \.php$ {
        try_files $uri =404;
        proxy_pass http://oldsites;
}
Очень интересно, спасибо! Обязательно попробую на стенде.
Директиву proxy_pass без URI следует указывать всегда, когда подмена URI не требуется. Чтобы потом проблем не было.

Есть разница даже между:

 location / {
     proxy_pass http://backend;
 }

и

 location / {
     proxy_pass http://backend/;
 }

В последнем случае осуществляется дополнительная обработка, помимо бессмысленной замены "/" на "/", также происходит декодирование всего URI. Но документацию же мало кто читает внимательно, поэтому последняя конструкция весьма распространена.
Спасибо! Пост исправлен. If'ов в конф. файле больше нет.

Я упустил момент, в котором nginx начал позволять использовать proxy_pass в location ~*. Только что проверил на тестовом стенде, 1.6.2 спокойно это переваривает. Люблю сообщество как раз за такие вещи!
Тут фокус в том и заключается, что для location ~* нельзя указать proxy_path напрямую.
ответил в комментарии выше.
Неа, не ответили.
Вам в данном случае не нужен в location regexp, вообще.
Право, эта дискуссия ставит меня в тупик.

Попробую объяснить более абстрактно. Предположим, у нас есть веб-сервер Apache (или группа веб серверов), что обслуживает, опять же предположим, домашние странички пользователей: /~username1 и /~username2. Перед ним установлен Nginx. У обоих (в общем случае N) пользователей установлена популярная CMS cmsname. У username1 в корне, у username2 в подкаталоге /superblog/. За авторизацию пусть отвечает login.php.

Конфигурацией вида location ~* /login.php мы с легкостью поймаем обе формы авторизации. Ваш же пример /location login.php — не сработает ни у одного из пользователей.
Пост исправлен. If'ов в конф. файле больше нет.

Я упустил момент, в котором nginx начал позволять использовать proxy_pass в location ~*. Однако, как подсказали в комментариях и я только что проверил на тестовом стенде, 1.6.2 спокойно это переваривает. Люблю сообщество как раз за такие вещи!
На мой взгляд у вордпресса проблем с безопасностью больше по темкам/плагинам, а не с брутфорсом…


Это только за январь
Если заменить в статье "/wp-login.php" на "/user/login", то защищать будем Drupal. Если на "/administrator/" — то Joomla. Можно ещё 10 разных CMS привести. Wordress для примера взят, как самый популярный.
Если расскажите как иначе подружить location ~* с proxy_pass, буду очень благодарен.
А в чем проблема?

location ~* /wp-login.php {
    proxy_pass http://backend:8080;
}
Ха! Видимо уже ни в чем. На стенде заработало. Спасибо!

На одной из более ранних версий nginx оно не срабатывало. Вот, правда, не помню на чем именно — на proxy_pass или на limit_req

Дополню-ка пост:)
На одной из более ранних версий nginx оно не срабатывало.
Вы видимо один из первых пользователей nginx? =)

nginx.org/ru/CHANGES.ru
Изменения в nginx 0.1.25                                          19.03.2005

    ...

    *) Добавление: директива proxy_pass может использоваться в location,
       заданных регулярным выражением.

Директива же limit_req могла использоваться в любых location всегда.
Ах, точно нет! :)

Если вдруг сохранился в резервных копиях старый стенд, посмотрю, что была за ошибка.
А можно как-то защитить от брутфорса http-auth?
У меня этим занимается fail2ban, например, его тоже можно влёт настроить, причем для всех сайтов шаред хостинга, и сразу для многих cms, дописав нужный путь в правило фильтра.
Задача может быть реализована в Nginx с помощью модуля ngx_http_limit_req_module [1], выступающем в роли фронт-энда к Apache или веб-сервера FastCGI.


Подскажите пожалуйста, как задача может быть реализована при использовании nginx в качестве nginx: т.е. статика + php-fpm через fastcgi_pass?
Уточню, как быть с цепочками:
location ~* /wp-login.php {
  limit_req  zone=login burst=4;
  fastcgi_pass unix:/var/php-fpm.sock;
}

location ~ \.php?$ {
  fastcgi_pass unix:/var/php-fpm.sock;
}

— всё ли верно?
Да, все так. В данном случае совершенно неважно, куда дальше идет трафик — на Апач или на fcgi-сокет: limit_eq действует на определенную секцию «location»
Да, это здорово.
Но ведь после секции «location ~* /wp-login.php»
стоит секция с более общим регулярным выражением, которое включает в себя и файл wp-login.php — «location ~ \.php?$»
Могу ошибаться — но разве секция location с RegEx срабатывает только при первом совпадении с RequestedURI? Мне кажется — с каждым. Нет?
В этом и озадаченность.
Sign up to leave a comment.

Articles