簡體   English   中英

如何在 NGINX 中的代理響應中重寫 URL

[英]How do I rewrite URLs in a proxy response in NGINX

我習慣於將 Apache 與 mod_proxy_html 一起使用,並且正在嘗試使用 NGINX 實現類似的功能。 具體用例是,我在根上下文服務器上的端口 8080 上有一個在 Tomcat 中運行的管理 UI:

http://localhost:8080/

我需要在端口 80 上顯示它,但是我在此主機上運行的 NGINX 服務器上還有其他上下文,因此想嘗試訪問它:

http://localhost:80/admin/

我希望以下超級簡單的服務器塊可以做到這一點,但事實並非如此:

server {
    listen  80;
    server_name screenly.local.akana.com;

    location /admin/ {
        proxy_pass http://localhost:8080/;
    }
}

問題是返回的內容 (html) 包含所有在根上下文中訪問的腳本和樣式信息的 URL,因此我需要重寫這些 URL 以從 /admin/ 而不是 / 開始。

我如何在 NGINX 中做到這一點?

我們應該首先仔細完整地閱讀有關proxy_pass 的文檔

傳遞給上游服務器的 URI 是根據“proxy_pass”指令是否與 URI 一起使用來確定的。 proxy_pass 指令中的尾部斜杠表示 URI 存在且等於/ 沒有尾部斜杠意味着沒有帽子 URI。

帶有 URI 的 Proxy_pass

location /some_dir/ {
    proxy_pass http://some_server/;
}

有了上面的,有以下代理:

http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/          some_subdir/some_file

基本上, /some_dir/被替換/改變從請求路徑/some_dir/some_subdir/some_file/some_subdir/some_file

沒有 URI 的 Proxy_pass

location /some_dir/ {
    proxy_pass http://some_server;
}

使用第二個(沒有尾部斜杠):代理是這樣的:

http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file

基本上,完整的原始請求路徑無需更改即可傳遞。


因此,在您的情況下,您似乎應該刪除尾部斜杠以獲得所需的內容。


警告

請注意,只有在 proxy_pass 中不使用變量時,自動重寫才有效。 如果你使用變量,你應該自己重寫:

location /some_dir/ {
  rewrite    /some_dir/(.*) /$1 break;
  proxy_pass $upstream_server;
}

還有其他一些重寫不起作用的情況,這就是為什么必須閱讀文檔的原因。


編輯

再次閱讀您的問題,似乎我可能錯過了您只想編輯 html 輸出。

為此,您可以使用sub_filter指令。 就像是 ...

location /admin/ {
    proxy_pass http://localhost:8080/;
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

基本上,您要替換的字符串和替換字符串

您可能還需要在具有數據壓縮的后端服務器的第一個“sub_filter”之前設置以下指令:

proxy_set_header Accept-Encoding "";

否則它可能無法工作。 對於您的示例,它將如下所示:

location /admin/ {
    proxy_pass http://localhost:8080/;
    proxy_set_header Accept-Encoding "";
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

您可以使用以下 nginx 配置示例:

upstream adminhost {
  server adminhostname:8080;
}

server {
  listen 80;

  location ~ ^/admin/(.*)$ {
    proxy_pass http://adminhost/$1$is_args$args;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;
  }
}

如果沒有需要用sub_filter重寫的超鏈接,你可以只使用proxy_redirect指令:

location /admin/ {
    proxy_pass http://localhost:8080/;
    proxy_redirect / /admin/
}

它根據給定的“匹配重寫”規則更改響應的 Location-Header。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM