2012-11-11 65 views
0

我試圖讓nginx代理在同一個域的子路徑上的各種應用程序。proxy_set_header不按預期方式工作

我的問題是,應用程序生成的鏈接使用/作爲它們的根而不是它們的子目錄。

我的配置是:

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

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//的URI更改,即你的後端應用程序預計/。有幾種可能的解決方案來解決這個問題:

  1. 實際上移動應用程序到/wiki/。通常這很容易做到。
  2. 更改您的應用程序以接受它的基礎URL,用於通過某些帶外方法生成鏈接等。許多應用程序已經通過一些配置選項支持這一點
  3. 嘗試用nginx自己替換你的應用程序返回的內容。有幾個nginx指令可以做到,特別是proxy_redirectproxy_cookie_pathsub filter。這是最脆弱的方法,除非您知道應用程序返回的內容以及必須更換的內容,否則不推薦。
+0

非常感謝您的解釋。爲了解決這個問題,我使用http://rubygems.org/gems/rack_http_script_name作爲sinatra應用程序,http://pythonpaste.org/deploy/modules/config.html#paste.deploy.config.PrefixMiddleware用於pyramid應用程序,以及我把我可以在自己的子域中修復的那個。 – madjar