Добрый день,<div><br></div><div>Известные костыли:</div><div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
if ($arg_l1 = '3') {</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
error_page 403 = @test;</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
return 403;</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
}</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
location @test {</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
proxy_pass <a href="http://mainsite.ru/" target="_blank"><font class="Apple-style-span" color="#000000">http://mainsite.ru/</font></a>;</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
}</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
location /direct {</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
proxy_pass <a href="http://mymt/" target="_blank"><font class="Apple-style-span" color="#000000">http://mymt/</font></a>;</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
}</blockquote></div><div><br></div><div>Alexandr Vasilenko<br>Web Developer<br><a href="http://www.savevid.com">www.savevid.com</a><br>ICQ:284752117/<a href="mailto:JID%3Amente@jabber.kiev.ua">JID:mente@jabber.kiev.ua</a><br>
Skype:menterr<br>mob: +38097-611-45-99<br>
<br><br><div class="gmail_quote">26 марта 2010 г. 16:40 пользователь alk <span dir="ltr"><<a href="mailto:nginx-forum@nginx.us">nginx-forum@nginx.us</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Добрый день!<br>
<br>
Я только начал осваивать nginx, и многие вещи мне еще совсем непонятны, поскольку я далек от языков программирования и с трудом понимаю regexp'ы. Но поставленная задача, мне кажется, и не требует глубоких знаний регулярных выражений. Очень надеюсь получить от вас помощь.<br>
Есть сайт, на котором выполняются только динамические запросы при помощи специально написанного cgi-скрипта. Сайт сильно перегружен в дневное время, хочется разгрузить его, отправляя определенные, наиболее частые или наиболее "тяжелые" по времени выполнения запросы на другой сайт, где при помощи upstream организовано выполнение на группе серверов.<br>
Фактически все сводится к проверке наличия тех или иных аргументов и перенаправления на тот или иной location.<br>
Я нашел несколько родственных тем на форуме, в частности:<br>
<a href="http://forum.nginx.org/read.php?21,58180" target="_blank">http://forum.nginx.org/read.php?21,58180</a><br>
<a href="http://forum.nginx.org/read.php?2,54954" target="_blank">http://forum.nginx.org/read.php?2,54954</a><br>
<br>
Но сделать так, как там приблизительно указано, у меня не получается.<br>
У меня запросы на сайт могут быть, например, такими:<br>
<a href="http://alk.ru:6446/c/xyz.exe?a=1" target="_blank">http://alk.ru:6446/c/xyz.exe?a=1</a><br>
<a href="http://alk.ru:6446/c/xyz.exe?l1=3&l2=2&CL=1&a=0" target="_blank">http://alk.ru:6446/c/xyz.exe?l1=3&l2=2&CL=1&a=0</a><br>
<a href="http://alk.ru:6446/c/xyz.exe?t=1473291_2_3" target="_blank">http://alk.ru:6446/c/xyz.exe?t=1473291_2_3</a><br>
и т.д.<br>
Я пробую, для проверки, сделать так, чтобы при наличии аргумента l1=3, запрос обслуживался на главном сайте, а если это не так, то уходил на upstream. Как я понимаю, простой проверкой if это не сработает, нужно обязательно делать rewrite, а потом уже разбирать по location'ам.<br>
Вот как выглядит мой config.<br>
<br>
#user nobody;<br>
worker_processes 1;<br>
#pid logs/nginx.pid;<br>
events {<br>
worker_connections 4096;<br>
}<br>
http {<br>
include mime.types;<br>
default_type application/octet-stream;<br>
log_format main '$remote_addr - $remote_user [$time_local] "$request" '<br>
'$status $body_bytes_sent "$http_referer" '<br>
'"$http_user_agent" "$http_x_forwarded_for"';<br>
#access_log logs/access.log main;<br>
sendfile on;<br>
#tcp_nopush on;<br>
#keepalive_timeout 0;<br>
keepalive_timeout 65;<br>
gzip on;<br>
<br>
upstream mymt {<br>
server <a href="http://172.29.10.88:8080" target="_blank">172.29.10.88:8080</a>;<br>
server <a href="http://172.29.10.10:8080" target="_blank">172.29.10.10:8080</a>;<br>
}<br>
<br>
server {<br>
listen 6446;<br>
server_name <a href="http://alk.ru" target="_blank">alk.ru</a>;<br>
location / {<br>
set $p "direct";<br>
if ($arg_l1 = '3') {set $p "test";<br>
rewrite ... $p last; #вот тут я не понимаю, как и что должно быть написано, мне не нужно ничего заменять в строке запроса, я просто хочу уйти на location /test<br>
}<br>
}<br>
location = /test {<br>
proxy_pass <a href="http://mainsite.ru/" target="_blank">http://mainsite.ru/</a>;<br>
}<br>
location /direct {<br>
proxy_pass <a href="http://mymt/" target="_blank">http://mymt/</a>;<br>
}<br>
}<br>
}<br>
<br>
Как видно выше, я торможу в понимании того, как должно быть правильно сделано перенаправление. В вышеуказанных темах делалось по-разному. В англоязычной человек писал как-то так (я интерпретирую под свои значения)<br>
rewrite ^(.*)$ /$p$1<br>
<br>
В руссскоязычной вообще все сделали "в лоб":<br>
<br>
location = / {<br>
if ($arg_l1 = '3') {rewrite ^ /test last;}<br>
proxy_pass <a href="http://mymt/" target="_blank">http://mymt/</a>;<br>
}<br>
location = /test {<br>
proxy_pass <a href="http://mainsite.ru/" target="_blank">http://mainsite.ru/</a>;<br>
}<br>
То есть, если имеется такой аргумент то отправить на location /test, а если нет, обслужить на mymt.<br>
<br>
Очень прошу помочь разобраться с разбором по условию. Подробности приветствуются. Чтение "Директивы модуля ngx_http_rewrite_module" мне, к сожалению, не помогло.<br>
<br>
Posted at Nginx Forum: <a href="http://forum.nginx.org/read.php?21,68037,68037#msg-68037" target="_blank">http://forum.nginx.org/read.php?21,68037,68037#msg-68037</a><br>
<br>
<br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
<a href="http://nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://nginx.org/mailman/listinfo/nginx-ru</a><br>
</blockquote></div><br></div>