Nginx 每个位置/将重写的 uri 传递给 proxy_pass

Posted

技术标签:

【中文标题】Nginx 每个位置/将重写的 uri 传递给 proxy_pass【英文标题】:Nginx per location / pass rewriten uri to proxy_pass 【发布时间】:2012-11-27 06:47:04 【问题描述】:

如果您想根据位置通过 proxypass 将 URL 请求代理到两个不同的后端,那么最快和最干净的解决方案是什么。

location /app1/ 
    alias /var/www/ruby/public;
    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_redirect    off;
    try_files $uri $uri/ @ruby;


location @ruby 
    proxy_pass http://127.0.0.1:3000;


location /app2/ 
    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_redirect    off;
    try_files $uri $uri/ @other;


location @other 
    proxy_pass http://127.0.0.1:8080;

使用此配置,nginx 将“/app1”或“/app2”传递给代理,后端无法识别 url/command ..

例如想在访问http://<nginx>/app1/messages 时仅传递给http://127.0.0.1:3000 /messages - 但在上面的配置中也将/app1/ 作为http://127.0.0.1:3000/app1/messages 传递。 /app2 也是如此

【问题讨论】:

【参考方案1】:

尝试将“/”放在上游名称的末尾 例如

proxy_pass http://127.0.0.1:8080/;

请看这篇文章: How to preserve request url with nginx proxy_pass

【讨论】:

由于"proxy_pass cannot have URI part in location given by regular expression...",这不起作用,请参阅***.com/questions/21662940/…。

以上是关于Nginx 每个位置/将重写的 uri 传递给 proxy_pass的主要内容,如果未能解决你的问题,请参考以下文章

将“this”传递给新对象的内联重写方法的正确方法是啥? [复制]

nginx 重写

Nginx 位置匹配

Nginx - 在 uwsgi_pass 之前重写 request_uri

nginx中的rewrite语句

nginx中的嵌套位置