Nginx → Ошибки конфигурирования nginx (или как правильно писать рерайты)
Привет, хабралюди!
По долгу службы приходится работать с веб-разработчиками, которые иногда пишут свои скрипты с рерайтами, которые им приходится адаптировать для nginx. Мне же приходится разгребать то, что там написано.
Все желающие получить помощь по рерайтам могут задавать вопросы в комментариях, потом, наверно, из этого будет оформлен еще один пост.
По долгу службы приходится работать с веб-разработчиками, которые иногда пишут свои скрипты с рерайтами, которые им приходится адаптировать для nginx. Мне же приходится разгребать то, что там написано.
Все желающие получить помощь по рерайтам могут задавать вопросы в комментариях, потом, наверно, из этого будет оформлен еще один пост.
Nginx → Правильное перенаправление запросов в Nginx
Игорь Сысоев в рассылке nginx-ru пишет:
На днях интересовался, как делается перенаправление запросов в Drupal и прочие.
Nginx → Рерайты с учетом GET параметров.
Столкнулся с задачей: нужно сделать рерайт из:
в:
Да-да, именно в эту сторону. Задача была в том, чтобы загнать в кэш сайт который не обновляется, чтобы не гонять из-за него кучу апачей и Оракл.
Очевидный вариант:
не сработал. Инспекция логов показала что директива rewrite прогоняет через регексп только часть до "?", то есть отбрасывает параметры GET.
Но выход был найден. Благодаря светлой идее товарища libc родилась идея использовать директиву if, ибо в ней можно использовать $request_uri, который еще с GET параметрами. В итоге получилось вот что:
В чем тут хитрость. Казалось бы, можно обойтись без set и передавать $1 прямо в директиву rewrite, но не тут-то было. Нгинкс еще на этапе чтения конфига ругается:
Из-за этого пришлось сначала загонять айди статьи в переменную, а ее уже использовать в rewrite.
Маленькое дополнение: в nginx версий выше 0.7.8 есть доступ к GET-параметрам через переменные nginx, так что такой проблемы бы и не возникло.
PS: Я понимаю что это частный случай, но может кому-нибудь однажди пригодится и не придется как мне париться.
/articles/?arg1=foo&arg2=bar&art_id=article123в:
/articles/article123.htmlДа-да, именно в эту сторону. Задача была в том, чтобы загнать в кэш сайт который не обновляется, чтобы не гонять из-за него кучу апачей и Оракл.
Очевидный вариант:
rewrite ^/articles/.*article(.*)$ /articles/article$1.html;не сработал. Инспекция логов показала что директива rewrite прогоняет через регексп только часть до "?", то есть отбрасывает параметры GET.
Но выход был найден. Благодаря светлой идее товарища libc родилась идея использовать директиву if, ибо в ней можно использовать $request_uri, который еще с GET параметрами. В итоге получилось вот что:
if ($request_uri ~* "/articles/.*article(.*)$)")
{
set $art $1;
rewrite ^.*$ /articles/article${art}.html break;
}В чем тут хитрость. Казалось бы, можно обойтись без set и передавать $1 прямо в директиву rewrite, но не тут-то было. Нгинкс еще на этапе чтения конфига ругается:
pattern "^.*$" has less captures than referrenced in substitution "/articles/article$1.html"Из-за этого пришлось сначала загонять айди статьи в переменную, а ее уже использовать в rewrite.
Маленькое дополнение: в nginx версий выше 0.7.8 есть доступ к GET-параметрам через переменные nginx, так что такой проблемы бы и не возникло.
PS: Я понимаю что это частный случай, но может кому-нибудь однажди пригодится и не придется как мне париться.
Веб-разработка → nginx, пользовательские поддомены и rewrite
В самых разнообразных веб-проектах возникает задача организации пользовательских поддоменов «на лету». При использовании nginx приходит на помощь следующая конструкция:
Хабрахабр → Непонятное зависание
Обнаружил какой-то непонятный глюк - если набирать в адресе своего хабрацентра ссылки на существующие реврайтовые страницы первого уровня без завершающих слешей, то Хабр зависает - браузер долго ждет от него ответа (точнее даже от http://freak.habrahabr.ru), а потом выдает, что сервер не найден.
Я имею в виду, например:
http://zerkella.habrahabr.ru/my
или
http://zerkella.habrahabr.ru/comments
и т.д.
Интересный такой баг, но очень неудобный, так как по умолчанию IE как раз сохраняет в автокомплите адреса без завершающего слеша. И, набирая его в адресной строке, приходится потом отдельно добавлять слеш.
Я имею в виду, например:
http://zerkella.habrahabr.ru/my
или
http://zerkella.habrahabr.ru/comments
и т.д.
Интересный такой баг, но очень неудобный, так как по умолчанию IE как раз сохраняет в автокомплите адреса без завершающего слеша. И, набирая его в адресной строке, приходится потом отдельно добавлять слеш.