Задать вопрос

Как сформировать правильный regexp для nginx location ?

Здравствуйте!
Помогите, пожалуйста, настроить nginx определённым образом. Nginx стоит перед апачем. Приложение складывает кешированные файлы в папке сайта - /home/admin/web/site.ru/public_html/cache.
Нужно для запроса вида "site.ru/12345/any-text" при отсутствии куки "cookie_name" проверять наличие файла /home/admin/web/site.ru/public_html/cache/12345 и отдавать его. А так же использовать сжатие для этого файла при возможности и указать заголовок тип данных - html. При отсутствии - отправлять запрос апачу.
Пробую так:
server {
    ...
    location ~/test/([0-9]*)/(.*)$ {
        types {
            text/html;
        }
        root           /home/admin/web/site.ru/public_html/cache;
        try_files      $1 @goapach;
    }
    ...
    location / {
        ...
    }
    ...
    location @goapach {
        proxy_pass      http://111.111.111.11:8080;
    }
}

test - соответственно пока для теста и без куки. Отправляет на апач...
  • Вопрос задан
  • 31657 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@AlexeyPortnov
Использование If - плохая практика, старайтесь избегать и использовать map.
Смотрите "If is evil": https://www.nginx.com/resources/wiki/start/topics/...
Ошибки конфигурирования nginx (или как правильно писать рерайты): habrahabr.ru/post/74135

map $http_cookie $redirect1 {
default 0;
"~*qa_session" 1;
}

map $request_method $redirect2 {
default 0;
POST 1;
}

location ~^/([0-9]*)/(.*)$ {
set $cache_file $1;
set $redirect 0;

if ( "$redirect1$redirect2" ) {
return 412;
error_page 412 = @goapach;
}
types {}
default_type text/html;
try_files /qa-plugin/cache-master/cache/$cache_file @goapach;
}
Ответ написан
Комментировать
@amaslenn
Попробуйте:
location ~/.*test.*

/ может обрабатываться как специальный символ в записи регулярных выражения в зависимости от используемого движка.

Если строку надо искать до цифр, то можно попробовать следующее:
location ~/.*test\/\d+.*
Ответ написан
Комментировать
Zilker
@Zilker Автор вопроса
В общем сделал так:
location ~^/([0-9]*)/(.*)$ {
    set $cache_file $1;
    set $redirect 0;
    if ( $http_cookie ~* qa_session ) {
        set $redirect 1;
    }
    if ( $request_method = POST ) {
        set $redirect 1;
    }
    if ( $redirect = 1 ) {
        return 412;
        error_page 412 = @goapach;
    }
    types {}
    default_type text/html;
    try_files /qa-plugin/cache-master/cache/$cache_file @goapach;
}

Авторизованных, POST запросы и при отсутствии файла кеша отправляем на апач ( уже php-fpm, не суть), иначе - отдаём файл из кеша.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы