Nginx 代理\u集合\u标头未按预期工作

Nginx 代理\u集合\u标头未按预期工作,nginx,reverse-proxy,Nginx,Reverse Proxy,我试图让nginx在同一个域的子路径上代理各种应用程序 我的问题是,应用程序生成的链接使用/作为其根,而不是子目录 我的配置是: location /wiki/ { proxy_pass http://localhost:4567/; proxy_set_header SCRIPT_NAME /wiki; } 我相信proxy\u set\u header SCRIPT\u NAME/wiki应设置头SCRIPT\u NAME,该头由应用程序用于生成链接,但设置了HTTP\u

我试图让nginx在同一个域的子路径上代理各种应用程序

我的问题是,应用程序生成的链接使用
/
作为其根,而不是子目录

我的配置是:

location /wiki/ {
    proxy_pass http://localhost:4567/;
    proxy_set_header SCRIPT_NAME /wiki;
}
我相信
proxy\u set\u header SCRIPT\u NAME/wiki
应设置头
SCRIPT\u NAME
,该头由应用程序用于生成链接,但设置了
HTTP\u SCRIPT\u NAME
,该头由应用程序忽略

如何设置
SCRIPT\u NAME
,以便正确生成链接?

根据,http头可用
http\u前缀:

也就是说,在应用程序中,header
Some header
将被视为
HTTP\u Some\u header
。也就是说,一切正常-您添加了http头,并使用
http\uu
前缀使其可用

SCRIPT\u NAME
变量不是由任何头设置的,而是由运行应用程序的代码根据URI构造的。要更改它,您必须实际更改后端看到的URI,即您需要

proxy_pass http://localhost:4567/wiki/;
或者只是在代理过程中没有
/wiki/
,只要它在
位置/wiki/
中,即

location /wiki/ {
    proxy http://localhost:4567;
}
这里的糟糕之处在于,您可能出于某种原因将URI从
/wiki/
更改为
/
,即您的后端应用程序需要
/
。此问题有几种可能的解决方案:

  • 实际将应用程序移动到
    /wiki/
    。通常这很简单
  • 通过一些带外方法,更改应用程序以接受其用于生成链接等的基本url。许多应用程序已经通过一些配置选项支持这一点
  • 尝试用nginx本身替换应用程序返回的内容。有几个nginx指令可以实现这一点,特别是。但这是最脆弱的方法,除非您知道应用程序返回的内容以及需要替换的内容,否则不推荐使用它

  • 非常感谢你的解释。为了解决这个问题,我使用了sinatra应用程序和金字塔应用程序,并将我可以修复的应用程序放在它们自己的子域中。
    location /wiki/ {
        proxy http://localhost:4567;
    }