我有几个API端点,我想在一个单独的/api
位置下进行服务,子path到达不同的端点。 具体来说,我希望webdis在/api
和/api/mypath
提供的专有API可用。
我并不担心与webdis API发生冲突,因为我使用的子path不太可能与redis命令名冲突,而且也完全控制了API的devise以避免冲突。
这里是我一直在testing的我的testing服务器的configuration文件:
server { listen 80; server_name localhost; server_name 192.168.3.90; server_name 127.0.0.1; location / { root /home/me/src/phoenix/ui; index index.html; } # temporary hardcoded workaround location = /api/mypath/about { proxy_pass http://localhost:3936/v1/about; } location /api { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://localhost:7379/; } # tried this but it gives "not found" error #location ^~ /api/mypath/ { # rewrite ^/api/mypath/(.*)$ /$1 break; # proxy_pass http://localhost:3936/v1/; #} # #location ^~ /api { # rewrite ^/api/(.*)$ /$1 break; # proxy_pass http://localhost:7379/; #} }
我怎样才能改变我的解决方法,以便对/api/mypath/*
任何请求将转到3936端口,其他一切到端口7379?
你不需要重写这个。
server { ... location ^~ /api/ { proxy_pass http://localhost:7379/; } location ^~ /api/mypath/ { proxy_pass http://localhost:3936/v1/; } }
根据nginx文档
位置可以由前缀string定义,也可以由正则expression式定义。 正则expression式使用前面的
~*
修饰符(用于不区分大小写的匹配)或~
修饰符(用于区分大小写的匹配)指定。 要查找匹配给定请求的位置,nginx首先检查使用前缀string(前缀位置)定义的位置。 其中,匹配前缀最长的位置被选中并记住。 然后按照它们在configuration文件中出现的顺序检查正则expression式。 正则expression式的search在第一次匹配时终止,并使用相应的configuration。 如果找不到正则expression式的匹配,则使用先前记住的前缀位置的configuration。如果最长匹配的前缀位置具有
^~
修饰符,则不检查正则expression式。
因此,以/api/mypath/
开头的任何请求都将始终由第二个块提供服务,因为这是最长的匹配前缀位置。
任何以/api/
开始的请求/api/
不是紧跟在mypath/
后面的请求都将始终由第一个块服务,因为第二个块不匹配,因此使第一个块成为最长的匹配前缀位置。
OK算了出来,我认为“未find”的错误来自nginx,但实际上它来自我的API。 如果有人感兴趣,这是我的解决scheme:
server { listen 80; server_name localhost; server_name 192.168.3.90; server_name 127.0.0.1; location / { root /home/me/src/phoenix/ui; index index.html; } # automatically go to v1 of the (grape) API location ^~ /api/mypath/ { rewrite ^/api/mypath/(.*)$ /v1/$1 break; proxy_pass http://localhost:3936/; } location ^~ /api { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://localhost:7379/; } }