Re: rewrite и параметры $1, $2, ...
28 августа 2014 г., 15:10 пользователь skeletor nginx-fo...@nginx.us написал: В документации по rewrite-модулю нашёл такой пример: location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } Что означают $1, $2? Можно пример запроса? Спасибо. http://www.regular-expressions.info/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
proxy if cookie + map
Добрый день, Ситуация следующая: имеется боевой сервер в связке nginx + php-fpm + новая версия сайта на соседнем сервере, на котором тоже крутится nginx и php-fpm. Задача такова: на боевом сервере настроить проксирование на новую версию сайта в зависимости от установленной у посетителя куки. Сложность в том, что в блок if нельзя завернуть proxy_set_header - на форумах советуют для этих целей использовать map с сопутствующей ссылкой на http://nginx.org/ru/docs/http/ngx_http_map_module.html. Никак не могу понять, как обойтись без if, а только map в моем случае? Другими словами, конструкция ниже работает только для внутренней сети (в логах браузера идет подгрузка с ip 192.168.2.146). server { ... if ($http_cookie ~ 'newsitetest') { set $newsite 1; } ... location ~* ^/(.+)$ { if ($newsite = 1) { proxy_pass http://192.168.2.146; break; } try_files $uri $uri/ /not_found.php?query_uri=/$1$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } -- С уважением ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Как правильно проксировать переменные $https и $scheme
On Thursday 28 August 2014 14:57:34 Константин Осипов wrote: [..] Не работает видимо по тому что нельзя изменять переменные $https и $scheme. Можно было бы сделать так: map $http_x_forwarded_proto $fastcgi_https { default ''; https on; } map $http_x_forwarded_proto $fastcgi_scheme { default http; https https; } Но я не хотел бы использовать не стандартные переменные потому что ниже в секции location я использую переменные $https и $scheme в множестве правил с rewrite. Не стандартные переменные создадут неудобства в случае если конфигурация изменится. Какие неудобства? Один раз выполнить команду поиск'и'замена - вот и всё неудобство. Подскажите пожалуйста как правильно решить мою задачу? Спасибо. Правильно оставить стандартные переменные в покое. Они определяют как запрос пришел к nginx, а он у вас приходит всегда без шифрования. У вас же другая задача, узнать, как запрос пришел на балансировщик, и для этой задачи нужно использовать другие переменные. И хорошо, что в вашей конфигурации будет это явно отражено, а не завуалированно в виде явного или неявного переопределения стандартных переменных. -- Валентин Бартенев ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: proxy if cookie + map
мы так делаем map $http_cookie $u { default old; ~new-int-rel new; } upstream old { least_conn; server xxx1; server xxx2; server xxx3; keepalive 10; } upstream new { least_conn; server xxx1:8585; server xxx2:8585; server xxx3:8585; keepalive 10; } .. proxy_pass http://$u; у вас, видимо, будет, fastcgi вместо http 28 августа 2014 г., 17:41 пользователь Синицкий Павел Евгеньевич sejo...@gmail.com написал: Добрый день, Ситуация следующая: имеется боевой сервер в связке nginx + php-fpm + новая версия сайта на соседнем сервере, на котором тоже крутится nginx и php-fpm. Задача такова: на боевом сервере настроить проксирование на новую версию сайта в зависимости от установленной у посетителя куки. Сложность в том, что в блок if нельзя завернуть proxy_set_header - на форумах советуют для этих целей использовать map с сопутствующей ссылкой на http://nginx.org/ru/docs/http/ngx_http_map_module.html. Никак не могу понять, как обойтись без if, а только map в моем случае? Другими словами, конструкция ниже работает только для внутренней сети (в логах браузера идет подгрузка с ip 192.168.2.146). server { ... if ($http_cookie ~ 'newsitetest') { set $newsite 1; } ... location ~* ^/(.+)$ { if ($newsite = 1) { proxy_pass http://192.168.2.146; break; } try_files $uri $uri/ /not_found.php?query_uri=/$1$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } -- С уважением ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: proxy if cookie + map
On Thursday 28 August 2014 15:41:58 Синицкий Павел Евгеньевич wrote: Добрый день, Ситуация следующая: имеется боевой сервер в связке nginx + php-fpm + новая версия сайта на соседнем сервере, на котором тоже крутится nginx и php-fpm. Задача такова: на боевом сервере настроить проксирование на новую версию сайта в зависимости от установленной у посетителя куки. Сложность в том, что в блок if нельзя завернуть proxy_set_header - на форумах советуют для этих целей использовать map с сопутствующей ссылкой на http://nginx.org/ru/docs/http/ngx_http_map_module.html. Никак не могу понять, как обойтись без if, а только map в моем случае? Другими словами, конструкция ниже работает только для внутренней сети (в логах браузера идет подгрузка с ip 192.168.2.146). server { ... if ($http_cookie ~ 'newsitetest') { set $newsite 1; } ... location ~* ^/(.+)$ { if ($newsite = 1) { proxy_pass http://192.168.2.146; break; } try_files $uri $uri/ /not_found.php?query_uri=/$1$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } location / { if ($http_cookie_newsitetest) { rewrite ^ /newsite/$uri last; } fastcgi_pass 127.0.0.1:9000; } location /newsite/ { proxy_pass http://192.168.2.146/; } -- Валентин Бартенев ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: rewrite и параметры $1, $2, ...
Hello! On Thu, Aug 28, 2014 at 07:10:43AM -0400, skeletor wrote: В документации по rewrite-модулю нашёл такой пример: location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } Что означают $1, $2? Можно пример запроса? Спасибо. Рядом, в описании директивы if, это расписано: : В регулярных выражениях можно использовать выделения, которые : затем доступны в виде переменных $1..$9. http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html#if Ну а вообще, как уже верно заметили, обращение к выделениям из регулярного выражения через переменные $1 и т.п. - это общая концепция во множестве мест. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: rewrite и параметры $1, $2, ...
Спасибо, теперь понятно. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,252919,252926#msg-252926 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: rewrite и параметры $1, $2, ...
On Thu, 28 Aug 2014 17:42:08 +0400 Maxim Dounin mdou...@mdounin.ru wrote: Hello! On Thu, Aug 28, 2014 at 07:10:43AM -0400, skeletor wrote: В документации по rewrite-модулю нашёл такой пример: location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } Что означают $1, $2? Можно пример запроса? Спасибо. Рядом, в описании директивы if, это расписано: : В регулярных выражениях можно использовать выделения, которые : затем доступны в виде переменных $1..$9. Кстати для тех кто не знаком с регулярными выражениями, слово выделения не совсем очевидны в мануале :) http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html#if Ну а вообще, как уже верно заметили, обращение к выделениям из регулярного выражения через переменные $1 и т.п. - это общая концепция во множестве мест. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- Peter B. Pokryshev p...@valuehost.ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: proxy if cookie + map
К сожалению необходимо в первом случае проксировать fstcgi, а при обращении к тестовому (если есть кука) проксировать по http Posted at Nginx Forum: http://forum.nginx.org/read.php?21,252921,252928#msg-252928 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: proxy if cookie + map
Спасибо, решение уже где-то рядом ) На боевом сервере за все отвечает php-скрипт. Сделал так: location / { if ($http_cookie ~ 'newsitetest') { rewrite ^ /newsite/$uri last; } rewrite / /not_found.php?query_uri=/$args; } location ~* ^/(.+)$ { if ($http_cookie ~ 'newsitetest') { rewrite ^ /newsite/$uri last; } try_files $uri $uri/ /not_found.php?query_uri=/$1$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QWERTY $document_root$fastcgi_script_name; } location /newsite/ { proxy_pass http://192.168.2.146; proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } После установки куки браузер выдает 500 ошибку, в логах nginx (который проксирует) ругань на циклический редирект 2014/08/28 18:21:51 [error] 19193#0: *454 rewrite or internal redirection cycle while processing /newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//not_found.php Posted at Nginx Forum: http://forum.nginx.org/read.php?21,252921,252930#msg-252930 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: proxy if cookie + map
On Thursday 28 August 2014 10:36:36 sejo412 wrote: Спасибо, решение уже где-то рядом ) На боевом сервере за все отвечает php-скрипт. Сделал так: location / { if ($http_cookie ~ 'newsitetest') { Зачем так усложнять. В nginx есть специальные переменные для работы с куками: $cookie_*. К изучению: http://nginx.org/ru/docs/http/ngx_http_core_module.html#variables rewrite ^ /newsite/$uri last; } rewrite / /not_found.php?query_uri=/$args; } location ~* ^/(.+)$ { Вам не нужен этот location с регуляркой. if ($http_cookie ~ 'newsitetest') { rewrite ^ /newsite/$uri last; } try_files $uri $uri/ /not_found.php?query_uri=/$1$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QWERTY $document_root$fastcgi_script_name; } location /newsite/ { proxy_pass http://192.168.2.146; Есть большая разница между: proxy_pass http://192.168.2.146; и proxy_pass http://192.168.2.146/; К изучению: http://nginx.org/r/proxy_pass/ru proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } После установки куки браузер выдает 500 ошибку, в логах nginx (который проксирует) ругань на циклический редирект 2014/08/28 18:21:51 [error] 19193#0: *454 rewrite or internal redirection cycle while processing /newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//newsite//not_found.php Ваш конфиг целиком должен выглядеть так: location / { if ($cookie_newsitetest) { rewrite ^ /newsite/$uri last; } try_files $uri $uri/ /not_found.php?query_uri=$uri$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.html; includefastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QWERTY $document_root$fastcgi_script_name; } location /newsite/ { internal; proxy_pass http://192.168.2.146/; proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } -- Валентин Бартенев ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru