Пара нюансов в NginX

Feb 20, 2018 18:55


Пара мелких нюансов в NginX, из серии "чтоб потом не забыть".

Допустим, хочется отдавать "/index.html" откуда-то из одной директории, а всё остальное - из какой-нибудь другой директории. Казалось бы, нет ничего проще. Пишем такой конфиг:
location = / {
root /some/foo/folder;
}

location / {
root /some/other/folder;
}

и с удивлением обнаруживаем, что это не работает.

А западло заключается в том, что если в URLе запроса отсутствует явная ссылка на конкретный файл, то NginX отдаёт индекс папки через внутренний редирект. Поэтому в вышеприведённой конфигурации он будет пытаться искать пресловутый "index.html" не в первом location, а во втором. Где его скорее всего нет. Поэтому никуда не деться, придётся добавить в конфигурацию как минимум ещё один, третий location:
location = /index.html {
root /some/foo/folder;
}

Так работает.

Другой пример. У нас NginX играет роль Reverse Proxy. Где-то за ним стоит Apache, который отдаёт контент. Хочется перенаправлять пользователя на SSL в том случае, если он пришёл через "голый" HTTP. Одна беда: бэкенд и скрипты на нём не знают, какой же протокол использовал фронтенд при обработке той или иной сессии. Надо как-то ему это показать, причём желательно не сильно глубоко переделывая программный код уже имеющихся скриптов. Вот один из вариантов решения. На NginX-е помимо всего прочего указываем:
proxy_set_header X-Forwarded-Proto $scheme;

А на Apache вот это:
SetEnvIf X-Forwarded-Proto https HTTPS=on;

И, скажем, PHP-кодеры могут продолжать использовать конструкции типа 'if $_SERVER["HTTPS"]=="on"' и больше ни о чём не думать.

администрирование, hints, it, nginx

Previous post Next post
Up