Web Мастерская»Блог

Сообщество Web Мастеров. Тут собрано всё, чтобы написать свой первый сайт, запустить его в Интернет и поддерживать его в течении всей его работы.

Как заблокировать IP адрес пользователя в Nginx

О том, как заблокировать IP в .htaccess, я рассказывал: Как заблокировать IP адрес пользователя в .htaccess, тут я расскажу, как заблокировать нежелательные IP адреса в Nginx, как это сделал я.

И так, у меня поселился один постоялец, крутится он на сайте круглые сутки, видимо это бот. Первые цифры IP: 141.8 - это неизменные цифры, остальные постоянно меняются. Было решено заблокировать его, для этого я открываю "etc/nginx/nginx.conf" и после: http { добавляю:
	deny 141.8.0.0/16;

Перечитываю конфигурацию Nginx командой:
nginx -s reload

Готово! Обратите внимание на то, как написан IP: 141.8.0.0/16 - первые две цифры (141.8), как есть, дальше следуют нули и /16 - это говорит о том, что цифры могут быть абсолютно любыми (диапазон). Если надо заблокировать, какой то конкретный IP, например: 141.8.142.114, пишем так:
	deny 141.8.142.114;

После добавления записи, которая кого то блокирует, в моем файле: "var/www/httpd-logs/danfa.net.error.log", появляются записи...

Nginx: Как запретить прямое обращение к файлам

Для одной задумки потребовалось запретить прямое обращение к файлам, при этом, чтобы сценарий движка, мог иметь полный доступ, к файлам. Сделать это надо было на Nginx. Мне помогли с этим и сейчас расскажу, что необходимо сделать, чтобы запретить.

Папка для запрета: /app/XX/data/. Вместо XX идентификатор приложения, то есть цифры, которые постоянно меняются.

Код для конфига Nginx:
	location ~* /app/\d+/data/ {
		valid_referers server_names;
		if ($invalid_referer) {
			return 404;
		}
	}

Многие пишут return 403 (Запрещено), я решил, что будет лучше отправлять на 404 ошибку, нежели прямо давать понять, что сюда нельзя.

После добавления строк выше, необходимо перечитать конфигурацию. Для этого я использую команду:
nginx -s reload

Готово. Теперь папка data скрыта от прямого обращения.

Возможно, пригодится: Тема: Команды для настройки сервера....

Nginx: Добавление слеша в конце URL, если его там нет

Ранее страницы моего сайта открывались, как с слэшем в конце URL, так и без него. Чтобы не допустить дублей страниц, я решил, что мой сайт будет работать только с слэшем в конце URL. Проверку слэша и его добавления делал на PHP:
		// Добавление слеша в конце URL, если его там нет
		if (substr($url, -1) != '/')
		{
			if (!preg_match('/(.*)\.(jpg|jpeg|gif|png|js|css|ico)/i', $url))
			{
				$url = $url . '/';
			}
		} // End: Добавление слеша в конце URL, если его там нет

Слэш добавляется ко всем URL, кроме тех, что имеют на конце: jpg|jpeg|gif|png|js|css|ico.

Всё работает отлично, но грешно делать это на PHP, если есть Nginx... Поискав в интернете решение моей задачи, нашёл такую строку кода:
rewrite ^([^.\?]*[^/])$ $1/ permanent;

Данный код добавляет слэш в конец всем URL, кроме тех, где есть точка (.) или параметры (id=1). А значит картинки, к которым будут обращаться на прямую, остаются без слэша.

Вставил строку в location:
	location / {
		rewrite
...

Nginx: Удаление лишних слэшев в URL

Ранее я удалял лишние слэши, при помощи PHP. Делал так:
		// Удаление лишних слешев
		if (preg_match('/\/{2,}/i', $url))
		{
			$url = preg_replace('/\/{2,}/', '$1/', $url);
		} // End: Удаление лишних слешев

Сегодня, наконец то, дошли руки, чтобы перенести удаление лишних слэшев в конфиг Nginx. Я добавил в server следующий код:
	# Удаление лишних слешев
	if ($request_uri ~ "//") {
		return 301 $uri;
	} # End: Удаление лишних слешев

После чего перечитал конфигурацию, при помощи команды:
nginx -s reload

Теперь код в PHP удаляю, больше он не нужен. Работает Nginx.

Возможно, будет интересно:
- Блог: Nginx: Добавление слеша в конце URL, если его там нет
- Блог: Nginx: Удаление параметров в URL...

Как перейти на HTTP2

Только что перешел на HTTP2. Сейчас расскажу, как я это сделал. У меня NGinx, по этому речь пойдет о нем.

Значит, я открываю конфигурацию NGinx, что находится в папке "/etc/nginx/vhosts/www-root", нахожу:
	listen 443 ssl;

И меняю на:
	listen 443 ssl http2;

Затем перечитываю конфигурацию NGinx командой:
nginx -s reload

Проверить версию HTTP2 можно тут: https://http2.pro/.

Полезные ссылки:
- Команды для настройки сервера
- Где находится файл "nginx.conf"...