Nginx 反向代理重寫 URL


需求

nginx 服務器代理前端頁面,並且反代后端服務器。開發時使用沒有什么問題,部署后存在同樣請求根地址的情況(當然可以針對一級后端地址寫多個配置,但是我懶……)。想起來之前查過這個重寫的方案。

一般反向代理

一般會定義一個統一前綴,比如:api,則配置如下

server {
    listen              80;
    server_name         default;
    
    location /api/ {
        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-NginX-Proxy true;

        proxy_pass http://example.com;
    }
}

則請求到 /api/exampleapi 時,會轉發到 http://example.com/api/exampleapi

設置proxy_pass即可。請求只會替換域名。

但我的情況是本來打算前后端放在一起,所以 server 那邊並沒有加 api 這個前綴。所以要將 /api/exampleapi 轉發到 http://example.com/exampleapi,則可按照如下兩種配置。

  • 方案一 在 proxy_pass 后增加 / 則 nginx 會將 /api 之后的內容拼接到 proxy_pass 之后。
server {
  listen              80;
  server_name         default;
    
  location /api/ {
      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-NginX-Proxy true;

      proxy_pass http://example.com/;
  }
}

方案二 使用 rewrite,注意到 proxy_pas s結尾沒有 /, rewrite 重寫了 url。

server {
  listen              80;
  server_name         default;
    
  location /api/ {
      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-NginX-Proxy true;

      rewrite ^/api/(.*)$ /$1 break;
      proxy_pass http://example.com;
  }
}

關於 rewrite

syntax: rewrite regex replacement [flag]
Default: —
Context: server, location, if


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM