Загадочная проблема с обработкой регулярных выражений

Andrey Rogovsky a.rogovsky at gmail.com
Tue Jul 1 02:42:33 UTC 2014


Имею следующий конфиг nginx:

-- начало --

server {
listen  80;
  server_name  mydomain.com;
  #access_log  /var/log/nginx/mydomain.com.access.log  main;
  access_log off;
  error_log   /var/log/nginx/mydomain.com.error.log crit;
        open_file_cache max=10000 inactive=120s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors off;

error_page 558 = @post;

  location / {
limit_req   zone=two  burst=3 nodelay;
      proxy_pass http://backend;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_redirect off;
      #proxy_set_header Host $host;
      proxy_set_header Host 'mydomain.com';
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header UA $uaix;
            proxy_set_header MSK $mskix;
      proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
      proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
      proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;
      proxy_connect_timeout 10;
      proxy_send_timeout 10;
      proxy_read_timeout 10;

    if ($request_method = POST) {
    return 558;
    }

  }
if ($uri ~ "^/script_var/(.+\.js)$") {
      set $jsname $1;
}
location  ~* /script_var/.+\.(js)$ {
  root /var/www/mydomain.com;
  try_files /adv/$geoip_country_code/$jsname  /adv/$jsname  = 404;
}
  location = /script.php {
return 444;
  }
        location ~ edit$ {
                return 444;
        }
  location ~ playlist.php$ {
      proxy_pass http://backend;
      proxy_redirect off;
      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;
      proxy_set_header UA $uaix;
            proxy_set_header MSK $mskix;
      proxy_connect_timeout 60;
      proxy_send_timeout 60;
      proxy_read_timeout 60;
  }
  location ~ admin.php$ {
      allow 91.218.74.202;
      allow 213.186.118.138;
      allow 94.232.208.220;
      allow 176.9.35.227;
      allow 83.69.224.215;
#      deny all;
      proxy_pass http://backend;
      proxy_redirect off;
      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;
proxy_set_header UA $uaix;
            proxy_set_header MSK $mskix;
                proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
                proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
                proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;
      proxy_connect_timeout 60;
      proxy_send_timeout 60;
      proxy_read_timeout 60;
  }
  location ~ ^/cgi-bin/.*\.cgi$ {
      proxy_pass http://backend;
      proxy_redirect off;
  }
  location ~ ^/adv/.*$ {
      deny all;
  }
        location ~
^/msqlmdmf/(.+\.(?:gif|jpe?g|png|ico|css|zip|tgz|gz|rar|bz2|tar|js))$ {
                alias /usr/share/phpmyadmin/$1;
        }
  # Static files location
  location ~*
^.+\.(swf|ver|ver|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js)$
{
      valid_referers none blocked *.mydomain.com mydomain.com;
                if ($invalid_referer) {
                       return   403;
                }
      root   /var/www/mydomain.com;
      expires 10080m;
  }
  location /nginx_status {
      stub_status on;
      access_log   off;
      allow 91.218.74.202;
      allow 213.186.118.138;
      allow 94.232.208.220;
      allow 212.113.52.4;
      deny all;
  }


location @post
{
limit_req   zone=two  burst=1;
set $limit_rate  128k;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_redirect off;
      #proxy_set_header Host $host;
      proxy_set_header Host 'mydomain.com';
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header UA $uaix;
            proxy_set_header MSK $mskix;
      proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
      proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
      proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;
      proxy_connect_timeout 10;
      proxy_send_timeout 10;
      proxy_read_timeout 10;
proxy_pass http://backend;
#return 444;
}

}

-- конец --

В общем все довольно стандартно.


При этом запрос к сайту вида http://mydomain.com/actors/Bezrukov
обрабатывается нормально:

2014/06/30 19:16:24 [debug] 39999#0: *3009 http script var:
"/actors/Bezrukov"
2014/06/30 19:16:24 [debug] 39999#0: *3009 http script regex:
"^/script_var/(.+\.js)$"
2014/06/30 19:16:24 [notice] 39999#0: *3009 "^/script_var/(.+\.js)$" does
not match "/actors/Bezrukov", client: 188.130.179.10, server: mydomain.com,
request: "GET /actors/Bezrukov HTTP
/1.1", host: "mydomain.com"
2014/06/30 19:16:24 [debug] 39999#0: *3009 http script if
2014/06/30 19:16:24 [debug] 39999#0: *3009 http script if: false
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: "/"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: "script.php"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: "nginx_status"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~
"/script_var/.+\.(js)$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~ "edit$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~ "playlist.php$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~ "admin.php$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~
"^/cgi-bin/.*\.cgi$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~ "^/adv/.*$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~
"^/msqlmdmf/(.+\.(?:gif|jpe?g|png|ico|css|zip|tgz|gz|rar|bz2|tar|js))$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 test location: ~
"^.+\.(swf|ver|ver|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js)$"
2014/06/30 19:16:24 [debug] 39999#0: *3009 using configuration "/"

А вот с запросом вида http://mydomain.com/actors/Bargess-Meredit происходит
вот такой глюк:

2014/06/30 19:16:45 [debug] 39996#0: *3523 http script var:
"/actors/Bargess-Meredit"
2014/06/30 19:16:45 [debug] 39996#0: *3523 http script regex:
"^/script_var/(.+\.js)$"
2014/06/30 19:16:45 [notice] 39996#0: *3523 "^/script_var/(.+\.js)$" does
not match "/actors/Bargess-Meredit", client: 188.130.179.10, server:
mydomain.com, request: "GET /actors/Bargess-Meredit HTTP/1.1", host: "
mydomain.com"
2014/06/30 19:16:45 [debug] 39996#0: *3523 http script if
2014/06/30 19:16:45 [debug] 39996#0: *3523 http script if: false
2014/06/30 19:16:45 [debug] 39996#0: *3523 test location: "/"
2014/06/30 19:16:45 [debug] 39996#0: *3523 test location: "script.php"
2014/06/30 19:16:45 [debug] 39996#0: *3523 test location: "nginx_status"
2014/06/30 19:16:45 [debug] 39996#0: *3523 test location: ~
"/script_var/.+\.(js)$"
2014/06/30 19:16:45 [debug] 39996#0: *3523 test location: ~ "edit$"
2014/06/30 19:16:45 [debug] 39996#0: *3523 using configuration "edit$"


Почему /actors/Bargess-Meredit не обрабатывается корневым локейшеном?

Причем я пробовал разные версии nginx - глюк повторяется что на текущем,
что на свежескаченном с официального сайта. ОС Debian 6.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20140701/a508d008/attachment-0001.html>


Подробная информация о списке рассылки nginx-ru