nginx различные настройки(rewrite)

Бло­ки­ров­ка

Thank you for reading this post, don't forget to subscribe!

Если необ­хо­ди­мо забло­ки­ро­вать все соеди­не­ния кро­ме 1 ip адреса:

 

Ниже при­ве­ден син­так­сис Nginx Rewrite:

В при­ве­ден­ном выше:

  • Дирек­ти­ва Rewrite явля­ет­ся частью моду­ля ngx_http_rewrite_module.
  • reg-ех – Это регу­ляр­ное выра­же­ние PCRE, кото­рое вы буде­те здесь ука­зать. Она будет исполь­зо­вать­ся для сопо­став­ле­ния вхо­дя­ще­го запро­са URI.
  • replacement – Если reqeust URI сов­па­да­ет с REG-ех, то Nginx будет исполь­зо­вать эту стро­ку заме­ны для изме­не­ния запро­са URI
  • flag – будет решать, тре­бу­ет­ся ли даль­ней­ший про­цесс дирек­тив Rewrite или нет. Это объ­яс­ня­ет­ся подроб­но в одном из при­ве­ден­ных ниже примеров.

В Nginx, дирек­ти­ва Rewrite может быть ука­за­на в одном из сле­ду­ю­щих трех кон­тек­стов: server, location, if

--------------------

Если необ­хо­ди­мо забло­ки­ро­вать все соеди­не­ния кро­ме 3 ip адресов:

или так:

location /test/ {
allow 10.10.10.10;
allow 10.10.10.11;
allow 10.10.10.12;
deny all;
proxy_pass http://10.10.10.13:1234/;
}

если к nginx летит не напря­мую а через haproxy

location /test/ {
set_real_ip_from 0.0.0.0/0;
real_ip_header X-FORWARDED-FOR;
allow 10.10.10.10;
allow 10.10.10.11;
allow 10.10.10.12;
deny all;
proxy_pass http://10.10.10.13:1234/;
}

1. Пример использования Nginx Rewrite $ 1, $ 2, ..

Ниже при­ве­ден при­мер дирек­ти­вы Nginx Rewrite:

Напри­мер:

  • url/data/distro/andreyex/test.php пере­пи­шет в виде url/data/distro/linux/test.html
  • В этом при­ме­ре, когда вы вызы­ва­е­те ори­ги­наль­ный URL с test.php из бра­у­зе­ра, он будет пере­пи­сан на осно­ве выше­при­ве­ден­но­го пра­ви­ла пере­за­пи­си и будет ука­зы­вать стра­ни­цу test.html из /data/distro/linux/

В при­ве­ден­ном выше пра­ви­ла перезаписи:

  • $ 1 и $ 2 будет фик­си­ро­вать соот­вет­ству­ю­щие стро­ки из исход­но­го URL, кото­рые не изменяется
  • $ 1 в заме­ща­ю­щей стро­ке заме­стит нахо­дит­ся внут­ри 1-й скоб­ки () в reg-ехе. В нашем при­ме­ре, $1 в /data/
  • Точ­но так же $ 2 заме­стит нахо­дит­ся внут­ри 2 скоб­ки () в reg-ехе. Таким обра­зом, $ 2 в (\w+), так что любое сло­во, кото­рое при­хо­дит после /andreyex/ в ори­ги­наль­ном URL. В нашем при­ме­ре, $ 2 явля­ет­ся test
  • last – этот флаг убе­дить­ся, что­бы оста­но­вить поиск дирек­ти­вы Rewrite в теку­щем место­по­ло­же­нии или бло­ке и исполь­зо­вать изме­нен­ный URI (т.е. пере­пи­сан URI) и искать новое место для любых даль­ней­ших дирек­тив Rewrite.
  • *$ – Ука­зы­ва­ет на рас­ши­ре­ние в исход­ном URL. Обра­ти­те вни­ма­ние, что здесь, рас­ши­ре­ние от исход­но­го URL будет заме­не­но на .html в URL путем Rewrite. Таким обра­зом, даже если вы вызы­ва­е­те .php в ори­ги­наль­ном URL, он будет пока­зы­вать толь­ко файл .html в пере­пи­сан­ной URL.

В то вре­мя как пра­ви­ла пере­за­пи­си Nginx дела­ют подоб­ные вещи, как Apache, есть еще мно­го раз­ли­чий в плане того, как вы пише­те пра­ви­ло пере­за­пи­си в Nginx.

2. Создание файла контроллера с помощью Nginx Rewrite

Исполь­зуя Rewrite, вы може­те трас­си­ро­вать мно­го посту­па­ю­щих ори­ги­наль­ных URL в шаб­лон масте­ра кон­трол­ле­ра, кото­рый будет обслу­жи­вать эти запросы.

Сле­ду­ю­щий при­мер Rewrite объ­яс­ня­ет это.

В при­ве­ден­ном выше при­ме­ре, когда вы дела­е­те запрос к URL andreyex.ru/linux/centos, он полу­чит пере­пи­сан­ный с исполь­зо­ва­ни­ем выше­ука­зан­но­го пра­ви­ла, и он выдаст стра­ни­цу с этим пере­пи­сан­ным URL: andreyex.ru/linux.php?distro=centos

Как вы види­те выше, любой URL, кото­рый име­ет соот­вет­ству­ю­щий шаб­лон здесь (т.е. /linux/ в URL) будет выпол­нять linux.php, но послед­няя часть в исход­ном вхо­дя­щем URL будет исполь­зо­вать­ся в каче­стве зна­че­ния для аргу­мен­та distro кон­трол­ле­ра linux.php.

Таким обра­зом, при­ве­ден­ное выше пра­ви­ло пере­за­пи­си пре­об­ра­зу­ет вхо­дя­щий URL, как здесь:

  • linux/centos becomes linux.php?distro=centos
  • linux/debian becomes linux.php?distro=debian
  • linux/redhat becomes linux.php?distro=redhat
  • и т.д.

Как и в преды­ду­щем при­ме­ре, мы исполь­зу­ем $ 1 в заме­ща­ю­щей стро­ке, что­бы захва­тить все, что нахо­дит­ся внут­ри 1-й скоб­ках () в reg-ех. В этом слу­чае, послед­няя часть ори­ги­наль­но­го вхо­дя­ще­го URL.

Мы так­же исполь­зу­ем здесь флаг last, что­бы про­ин­струк­ти­ро­вать Nginx, оста­но­вить поиск даль­ней­ших дирек­тив Rewrite в теку­щем-бло­ке и о пере­хо­де к сле­ду­ю­ще­му месту соот­вет­ствия для даль­ней­ше­го поиска.

3. Rewrite Break Flag в локальном контексте

В этом при­ме­ре, мы поме­сти­ли усло­вие пере­за­пи­си внут­ри дирек­ти­вы location.

В этом при­ме­ре дирек­ти­ва location /data/, так­же сов­па­да­ет с $ 1 в стро­ке заме­ны, при­ве­ден­ной ниже.

Это то, что слу­чи­лось бы, если бы вы исполь­зо­ва­ли флаг «last»:

  • Так что, если у вас был флаг «last», после пер­во­на­чаль­ной пере­за­пи­си URL, Nginx как пра­ви­ло, ищет сле­ду­ю­щую дирек­ти­ву rewrite для ново­го URL.
  • В этом слу­чае, Nginx будет дер­жать пере­на­прав­ле­ние на одни и те же дан­ные о место­по­ло­же­нии и про­дол­жать обра­бот­ку тех же пра­вил пере­за­пи­си мак­си­мум 10 раз, и, потом, он воз­вра­тит код 500 ошибок.

Так как мы не хотим опи­сан­ное выше пове­де­ние, мы исполь­зо­ва­ли «break» в каче­стве фла­га, кото­рый про­сто оста­но­вит обра­бот­ку пере­за­пи­си блоков.

4. Добавление вопросительного знака при замене строки в Nginx Rewrite

Если стро­ка заме­ны вклю­ча­ет новые аргу­мен­ты запро­са, преды­ду­щие аргу­мен­ты запро­са добав­ля­ют­ся после них. Если вы не хоти­те этого,установка зна­ка вопро­са в кон­це стро­ки заме­ны избав­ля­ет от необ­хо­ди­мо­сти их добавлять.

В сле­ду­ю­щем при­ме­ре, в стро­ке заме­ны, нет зна­ка вопро­са в кон­це. т.е. нет вопро­си­тель­но­го зна­ка после $ 1

В при­ве­ден­ном выше при­ме­ре, когда заме­на стро­ки вклю­ча­ет вхо­дя­щие аргу­мен­ты запро­са, то аргу­мен­ты из преды­ду­ще­го запро­са добав­ля­ет­ся после них.

Несколь­ко раз, вы, веро­ят­но, не хоти­те, что­бы добав­ле­ние про­изо­шло. Что в этом слу­чае реко­мен­ду­ет­ся исполь­зо­вать? Пока­за­но ниже.

Что в сле­ду­ю­щем при­ме­ре в стро­ке заме­ще­ния Rewrite Nginx, мы доба­ви­ли? в кон­це. Суще­ству­ет вопро­си­тель­ный знак после $ 1

В при­ве­ден­ном выше при­ме­ре, стро­ка заме­ны вклю­ча­ют вхо­дя­щие аргу­мен­ты запро­са, поэто­му аргу­мен­ты из преды­ду­ще­го запро­са не добав­ля­ет­ся после них.

5. If и Директива Rewrite

Сле­ду­ю­щие несколь­ко при­ме­ров пока­зы­ва­ют, что мы можем исполь­зо­вать Rewrite внут­ри дирек­ти­вы if.

Вы може­те сде­лать услов­ное пере­пи­сы­ва­ние на осно­ве if, если усло­вие срав­не­ния с исполь­зо­ва­ни­ем пере­мен­ных, таких как $scheme, $http_host, $http_user_agent, и т.д., как пока­за­но ниже:

Обра­ти­те вни­ма­ние, что есть луч­шие спо­со­бы для дости­же­ния конеч­но­го резуль­та­та при­ве­ден­ных выше при­ме­ров. При­ве­ден­ные выше при­ме­ры про­сто даны для того, что­бы пока­зать, что мы можем доба­вить дирек­ти­ву rewrite внут­ри, если заяв­ле­ние в фай­ле кон­фи­гу­ра­ции Nginx.

Обра­ти­те вни­ма­ние, что вы може­те так­же уста­но­вить зна­че­ние двух сле­ду­ю­щих пара­мет­ров или выклю­чить в фай­ле кон­фи­гу­ра­ции Nginx:

6. Примеры флагов в Nginx Rewrite

Ниже при­ве­де­ны 4 раз­лич­ных дирек­тив flags в Nginx Rewrite, кото­рые вы може­те использовать.

last: Этот флаг оста­но­вит обра­бот­ку дирек­тив пере­за­пи­си в теку­щем набо­ре, и нач­нет на новом месте , кото­рое соот­вет­ству­ет изме­нен­ной URL.

 

break: Этот флаг оста­но­вит обра­бот­ку дирек­тив пере­за­пи­си в теку­щем наборе.

 

redirect: Этот флаг будет делать вре­мен­ную пере­ад­ре­са­цию с исполь­зо­ва­ни­ем 302 HTTP – кода. Это в основ­ном исполь­зу­ет­ся , когда стро­ка заме­ны не HTTP или HTTPS, или $ схема

permanent: Этот флаг будет делать посто­ян­ную пере­ад­ре­са­цию с помо­щью HTTP 301 кода

7. Захват доступа Nginx Rewrite в Error Log File

По умол­ча­нию, в любое вре­мя, при успеш­ной пере­за­пись в Nginx, он не реги­стри­ру­ет его в error.log.

Пер­во­на­чаль­но, когда вы пише­те слож­ные пра­ви­ла пере­за­пи­си, вы дей­стви­тель­но хоти­те убе­дить­ся, что Nginx будет делать rewrite соглас­но ваше­му требованию.

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

Для это­го исполь­зуй­те дирек­ти­ву rewrite_log.

Добавь­те сле­ду­ю­щие две стро­ки в Nginx default.conf:

 

В при­ве­ден­ном выше:

  • Пер­вая стро­ка ука­зы­ва­ет место­по­ло­же­ние фай­ла error_log, где мы хотим, что­бы запи­сы­ва­лись сооб­ще­ния о пере­за­пи­си. Обра­ти­те вни­ма­ние, что сооб­ще­ние пере­за­пи­си, типа уве­дом­ле­ния. Таким обра­зом, вы долж­ны доба­вить «note» в кон­це этой линии, как пока­за­но выше.
  • rewrite_log on – Эта линия вклю­ча­ет веде­ние жур­на­ла всех дирек­тив моду­ля ngx_http_rewrite_module в файл error_log.

После ука­зан­но­го изме­не­ния, вы нача­ли видеть такие стро­ки, кото­рые ясно пока­зы­ва­ют, какие кон­крет­ные пра­ви­ла пере­пи­сы­ва­ют­ся в пере­во­де вхо­дя­ще­го URL. Это так­же пока­жет окон­ча­тель­ный пере­вод URL в запи­си журнала.

В при­ве­ден­ном выше строк лога:

  • Пер­вая линия пока­зы­ва­ет две вещи 1) Вхо­дя­щий URL 2) исполь­зу­е­мые пра­ви­ла перезаписи
  • В 1-й линии, пока­зы­ва­ет­ся вхо­дя­щий URL (т.е. запрос). В этом при­ме­ре запрос: «GET /data/distro/andreyex/test»
  • В 1-й линии, он так­же пока­зы­ва­ет пра­ви­ла пере­за­пи­си Nginx, кото­ро­му соот­вет­ство­вал этот вхо­дя­щий запрос. В этом при­ме­ре пра­ви­ло пере­за­пи­си исполь­зу­е­мой Nginx явля­ет­ся: “^(/data/.*)/andreyex/(\w+)\.?.*$”
  • Во 2-й линии, пока­зы­ва­ет пере­пи­сан­ный пере­ве­ден­ный URL, кото­рый исполь­зо­вал­ся в Nginx после при­ме­не­ния пра­ви­ла пере­за­пи­си. В этом при­ме­ре, пере­ве­ден­ный URL пере­пи­сан: /data/distro/linux/test.html