proxy_set_header无法按预期工作

时间:2012-11-11 10:38:34

标签: nginx reverse-proxy

我正在尝试在同一域的子路径上使用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以便正确生成我的链接?

1 个答案:

答案 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/更改为/,即您的后端应用程序需要/。这个问题有几种可能的解决方案:

  1. 实际上将应用程序移至/wiki/。通常这很容易做到。
  2. 通过一些带外方法更改您的应用以接受用于生成链接等的基本网址。许多应用程序已通过某些配置选项支持此功能。
  3. 尝试用nginx本身替换你的应用程序返回的内容。有几个nginx指令要做,特别是proxy_redirectproxy_cookie_pathsub filter。这是最脆弱的方法,除非你知道你的应用程序返回什么以及究竟需要替换什么,否则不推荐使用。