我正在尝试在同一域的子路径上使用nginx代理各种应用程序。
我的问题是应用程序生成的链接使用/
作为其根而不是其子目录。
我的配置是:
location /wiki/ {
proxy_pass http://localhost:4567/;
proxy_set_header SCRIPT_NAME /wiki;
}
我相信proxy_set_header SCRIPT_NAME /wiki;
应该设置标头SCRIPT_NAME
,应用程序使用该标头来生成链接,但设置了HTTP_SCRIPT_NAME
,应用程序会忽略它。
如何设置SCRIPT_NAME
以便正确生成我的链接?
答案 0 :(得分:2)
根据CGI specification,http标头可以使用HTTP_
前缀:
Meta-variables with names beginning with "HTTP_" contain values read from the client request header fields, if the protocol used is HTTP. The HTTP header field name is converted to upper case, has all occurrences of "-" replaced with "_" and has "HTTP_" prepended to give the meta-variable name.
也就是说,标题Some-Header
将在您的应用中被视为HTTP_SOME_HEADER
。也就是说,预期一切正常 - 您添加了http标头,并使用HTTP_
前缀提供了它。
SCRIPT_NAME
变量是special并且不是由任何标头设置的,而是由运行应用程序的代码从URI构造的。要更改它,您必须实际更改后端看到的URI,即您需要
proxy_pass http://localhost:4567/wiki/;
或者在proxy_pass中没有/wiki/
,只要它在location /wiki/
中,无论如何,即
location /wiki/ {
proxy http://localhost:4567;
}
这里的不好之处在于您可能由于某种原因从/wiki/
更改为/
,即您的后端应用程序需要/
。这个问题有几种可能的解决方案:
/wiki/
。通常这很容易做到。