NGINX: пример использования rewrite и rewrite_log

Автор: | 01/09/2015

nginx_logoЗадача – настроить rewrite на NGINX, и включить запись логов для отладки.

Содержание

Rewrite

rewrite в NGINX реализован с помощью модуля ngx_http_rewrite_module.

Пример правил, используемый у нас:

        location ~ ^/$ {
                rewrite ^(.*)$ /cloudlibrary/ui/ redirect;
        }

        if ($request_uri ~ ^/cloudlibrary) {
                rewrite ^/.*cloudlibrary/uiold/(.*) /cloudlibrary/uiold/$1 break;
                rewrite ^/.*cloudlibrary/ui/(.*!(.css|.png|.js|.html|.jpg|.svg|.gif|.ico|.woff|.ttf|.eot)) /cloudlibrary/$1;
                rewrite ^/.*cloudlibrary/ui(.*) /build$1;
                rewrite ^/.*cloudlibrary/$ /build/index.html break;
        }

        location /build {

                if (!-f $request_filename) {
                        rewrite  ^(.*)$  /build/index.html;
                }
        }

Наиболее интересными параметрами тут являются breakredirect и т.д.:

  • last – проверяет правила в текущем location, если правило с флагом last применяется – то NGINX переходит к следующему location;
  • break – если условие с этим флагом совпадает с заданным URI (не путать с URL)- то NGINX возвращается к первому правилу в списке;
  • redirect – возвращает временное перенаправление с кодом 302; используется, если заменяющая строка не начинается с “http://” или “https://”;
  • permanent – возвращает постоянное перенаправление с кодом 301.

В условиях if {} можно проверять любое значение, например – проверка cookie:

  if ($http_cookie ~* !"accept_cookie" ) {
    passenger_enabled on;
    rack_env production;
    break;
  }

Полный список переменных можно найти тут>>>.

Логгирование

Создаём новый шаблон лога в файле nginx.conf, в блоке http {}:

    log_format proxy  '[$time_local] $remote_addr - $server_name to: '
                      '$upstream_addr: $request upstream_response_time '
                      '$upstream_response_time msec $msec request_time $request_time';

В фaйле конфигурации хоста – добавляем его:

        rewrite_log on;
        ...
        access_log  /var/log/nginx/dev.domain.com_access.log proxy;
        error_log   /var/log/nginx/dev.domain.com_error.log notice;

Проверяем:

2015/09/01 09:06:51 [notice] 20079#0: *853 "^/.*cloudlibrary/uiold/(.*)" does not match "/cloudlibrary/access/permissions/outgoing", client: 194.105.145.69, server: www.dev.domain.com, request: "GET /cloudlibrary/access/permissions/outgoing?subject=8cba2317-24ad-418a-b6d7-8a3821f04d22 HTTP/1.1", host: "www.dev.domain.com", referrer: "https://www.dev.domain.com/cloudlibrary/ui/projects/8cba2317-24ad-418a-b6d7-8a3821f04d22"
...
2015/09/01 09:21:54 [notice] 20079#0: *1581 "^/.*cloudlibrary/ui(.*)" matches "/cloudlibrary/ui/imgs/img-placeholder.png", client: 194.105.144.244, server: www.dev.domain.com, request: "GET /cloudlibrary/ui/imgs/img-placeholder.png HTTP/1.1", host: "www.dev.domain.com", referrer: "https://www.dev.domain.com/cloudlibrary/ui/css/main.css"
2015/09/01 09:21:54 [notice] 20079#0: *1581 rewritten data: "/build/imgs/img-placeholder.png", args: "", client: 194.105.144.244, server: www.dev.domain.com, request: "GET /cloudlibrary/ui/imgs/img-placeholder.png HTTP/1.1", host: "www.dev.domain.com", referrer: "https://www.dev.domain.com/cloudlibrary/ui/css/main.css"

Готово.