Nginx位置和URI匹配

时间:2014-03-03 00:48:56

标签: ruby-on-rails nginx

我正在尝试使用nginx作为反向代理,但遇到URI匹配问题

Application_1在8080上运行 Application_2运行于8181

/ api / v1 / sql url将被定向到Application_1
/ api / v1 / map和/ tiles url将定向到Application_2

和rails应用程序的其余URL。下面是我对nginx配置的尝试,但我认为Application_2匹配存在错误。

    upstream application_1{
            server  127.0.0.1:8080;
    }

    upstream application_2{
            server  127.0.0.1:8181;
    }


    location ^~  /api/v1/sql/ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_redirect off;
            proxy_pass http://application_1;
            break;
            error_page  404 = /;
    }



    location ^~ (/api/v1/map/ | /tiles) {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_redirect off;
            proxy_pass http://application_2;
            break;
            error_page  404 = /;
    }

    location / {

        if ($http_origin) {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods "GET,POST,OPTIONS,PUT";
                add_header         Access-Control-Allow-Headers   Content-Type;
                add_header         Access-Control-Max-Age         86400;
        }
       passenger_spawn_method direct;
       root    /var/www/html ;
       passenger_enabled on;            
       rails_env development;
   }

当我尝试发布http://mywebsite.com/api/v1/map?q=abcd时,我会收到状态消息“301 Moved Permanently”,但是当我直接从应用程序访问时http://mywebsite.com:8181/api/v1/map?q=abcd。它运作正常。

此外,http://mywebsite.com/api/v1/maps必须由rails而不是application_2

提供

任何人都可以帮我正确配置nginx locatin吗?

由于

1 个答案:

答案 0 :(得分:0)

我认为您的问题与位置定义结尾处/有关。

您正在请求/api/v1/map?q=abcd,并且您的配置中有/api/v1/map**/**(尾随/) Nginx尝试将您的/api/v1/map请求重定向到/api/v1/map**/**(因为它最后配置了/),对吗?

我建议您配置您的位置:

location ^~ /api/v1/sql
location ^~ /api/v1/map
nginx中的

^~表示以优先级开头且具有高优先级的匹配位置。这样甚至你的/api/v1/maps uri也应该匹配好。

希望它有所帮助。